Skip to content

Commit

Permalink
Fixing the bug with AddInstanceOf<Blah>() creating two instances in t…
Browse files Browse the repository at this point in the history
…he call to GetAllInstances()
  • Loading branch information
jeremydmiller committed Feb 28, 2008
1 parent 3307e04 commit cffd3a6
Show file tree
Hide file tree
Showing 11 changed files with 70 additions and 24 deletions.
2 changes: 1 addition & 1 deletion Source/StructureMap.AutoMocking/RhinoAutoMocker.cs
Expand Up @@ -77,7 +77,7 @@ public T Get<T>()
// Set the auto mocking container to use a Stub for Type T
public void InjectStub<T>(T stub)
{
_manager.InjectStub<T>(stub);
_manager.Inject<T>(stub);
}

// So that Aaron Jensen can use his concrete HubService object
Expand Down
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using NUnit.Framework;
using StructureMap.Attributes;
using StructureMap.Configuration.DSL;
Expand Down Expand Up @@ -174,6 +175,39 @@ public void TheDefaultInstanceIsPickedUpFromTheAttribute()

Assert.IsInstanceOfType(typeof (DefaultGateway), gateway);
}

[Test]
public void AddInstanceByNameOnlyAddsOneInstanceToStructureMap()
{
Registry registry = new Registry();
registry.ForRequestedType<Something>().AddInstance(
Registry.Instance<Something>().UsingConcreteType<RedSomething>().WithName("Red")
);

IInstanceManager manager = registry.BuildInstanceManager();
IList<Something> instances = manager.GetAllInstances<Something>();
Assert.AreEqual(1, instances.Count);
}

[Test]
public void AddInstanceWithNameOnlyAddsOneInstanceToStructureMap()
{
PluginGraph graph = new PluginGraph();
Registry registry = new Registry(graph);
registry.AddInstanceOf<Something>().UsingConcreteType<RedSomething>().WithName("Red");



IInstanceManager manager = registry.BuildInstanceManager();
IList<Something> instances = manager.GetAllInstances<Something>();
Assert.AreEqual(1, instances.Count);
}

public class Something{}

public class RedSomething : Something{}
public class GreenSomething : Something{}

}

public class StubbedInstanceFactoryInterceptor : InstanceFactoryInterceptor
Expand Down
Expand Up @@ -54,7 +54,7 @@ public void EnumSetter()
{
PluginFamily family = new PluginFamily(typeof (IGridColumn));
Plugin plugin = Plugin.CreateImplicitPlugin(typeof (EnumGridColumn));
family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);

InstanceFactory factory = new InstanceFactory(family, true);
InstanceMemento memento = _source.GetMemento("Enum");
Expand All @@ -69,7 +69,7 @@ public void PrimitiveNonStringSetter()
{
PluginFamily family = new PluginFamily(typeof (IGridColumn));
Plugin plugin = Plugin.CreateImplicitPlugin(typeof (LongGridColumn));
family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);

InstanceFactory factory = new InstanceFactory(family, true);
InstanceMemento memento = _source.GetMemento("Long");
Expand All @@ -86,7 +86,7 @@ public void StringSetter()
{
PluginFamily family = new PluginFamily(typeof (IGridColumn));
Plugin plugin = Plugin.CreateImplicitPlugin(typeof (StringGridColumn));
family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);

InstanceFactory factory = new InstanceFactory(family, true);
InstanceMemento memento = _source.GetMemento("String");
Expand Down
Expand Up @@ -97,7 +97,7 @@ public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIsConcreteType<CONCRET

_alterations.Add(delegate(PluginFamily family)
{
Plugin plugin = family.Plugins.FindOrCreate(typeof (CONCRETETYPE));
Plugin plugin = family.Plugins.FindOrCreate(typeof (CONCRETETYPE), true);
family.DefaultInstanceKey = plugin.ConcreteKey;
});

Expand Down Expand Up @@ -161,7 +161,7 @@ public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<CONCRETETYPE>(st
{
Plugin plugin = Plugin.CreateImplicitPlugin(typeof (CONCRETETYPE));
plugin.ConcreteKey = instanceName;
family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);
}
);

Expand Down
Expand Up @@ -25,7 +25,10 @@ internal Type PluggedType

protected override InstanceMemento memento
{
get { return _memento; }
get
{
return _memento;
}
}

protected override InstanceExpression thisInstance
Expand All @@ -42,7 +45,7 @@ protected override void configureMemento(PluginFamily family)
{
Plugin plugin = _pluggedType == null
? family.Plugins[_memento.ConcreteKey]
: family.Plugins.FindOrCreate(_pluggedType);
: family.Plugins.FindOrCreate(_pluggedType, false);

_memento.ConcreteKey = plugin.ConcreteKey;
}
Expand Down Expand Up @@ -176,6 +179,7 @@ internal InstanceTypeExpression(InstanceExpression parent)
public InstanceExpression UsingConcreteType<T>()
{
_parent._pluggedType = typeof (T);
_parent._memento.InstanceKey = typeof (T).Name;
return _parent;
}

Expand Down
4 changes: 2 additions & 2 deletions Source/StructureMap/Configuration/NormalGraphBuilder.cs
Expand Up @@ -159,7 +159,7 @@ public Plugin AddPlugin(TypePath pluginTypePath, TypePath pluginPath, string con

Plugin plugin = new Plugin(pluginPath, concreteKey);
plugin.DefinitionSource = DefinitionSource.Explicit;
family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);

return plugin;
}
Expand Down Expand Up @@ -200,7 +200,7 @@ public void RegisterMemento(TypePath pluginTypePath, InstanceMemento memento)
Plugin inferredPlugin = memento.CreateInferredPlugin();
if (inferredPlugin != null)
{
family.Plugins.Add(inferredPlugin);
family.Plugins.Add(inferredPlugin, true);
}

family.Source.AddExternalMemento(memento);
Expand Down
18 changes: 10 additions & 8 deletions Source/StructureMap/Graph/PluginCollection.cs
Expand Up @@ -93,7 +93,7 @@ public Plugin[] All
public void Add(TypePath path, string concreteKey)
{
Plugin plugin = new Plugin(path, concreteKey);
Add(plugin);
Add(plugin, true);
}

/// <summary>
Expand All @@ -105,10 +105,10 @@ public void Add(TypePath path, string concreteKey)
public void Add(Type pluggedType, string concreteKey)
{
Plugin plugin = Plugin.CreateExplicitPlugin(pluggedType, concreteKey, string.Empty);
Add(plugin);
Add(plugin, true);
}

public void Add(Plugin plugin)
public void Add(Plugin plugin, bool addInstanceOfTypeIfPossible)
{
// Reject if a duplicate ConcreteKey
if (_plugins.ContainsKey(plugin.ConcreteKey))
Expand All @@ -129,10 +129,12 @@ public void Add(Plugin plugin)
throw new StructureMapException(114, plugin.PluggedType.FullName, _family.PluginTypeName);
}

plugin.AddToSource(_family.Source);


_plugins.Add(plugin.ConcreteKey, plugin);

if (addInstanceOfTypeIfPossible)
{
plugin.AddToSource(_family.Source);
}
}

/// <summary>
Expand Down Expand Up @@ -162,10 +164,10 @@ public void RemoveImplicitChildren()
}
}

public Plugin FindOrCreate(Type pluggedType)
public Plugin FindOrCreate(Type pluggedType, bool createDefaultInstanceOfType)
{
Plugin plugin = Plugin.CreateImplicitPlugin(pluggedType);
Add(plugin);
Add(plugin, createDefaultInstanceOfType);

return plugin;
}
Expand Down
6 changes: 3 additions & 3 deletions Source/StructureMap/Graph/PluginFamily.cs
Expand Up @@ -20,7 +20,7 @@ public static PluginFamily CreateAutoFilledPluginFamily(Type pluginType)
PluginFamily family = new PluginFamily(pluginType);
family.DefinitionSource = DefinitionSource.Implicit;

family.Plugins.Add(plugin);
family.Plugins.Add(plugin, true);
family.DefaultInstanceKey = plugin.ConcreteKey;

return family;
Expand Down Expand Up @@ -135,7 +135,7 @@ public PluginFamily CreateTemplatedClone(params Type[] templateTypes)
if (isOfCorrectGenericType(plugin, templateTypes))
{
Plugin templatedPlugin = plugin.CreateTemplatedClone(templateTypes);
templatedFamily.Plugins.Add(templatedPlugin);
templatedFamily.Plugins.Add(templatedPlugin, true);
foreach (InstanceMemento memento in _source.GetAllMementos())
{
if (memento.ConcreteKey == plugin.ConcreteKey)
Expand Down Expand Up @@ -196,7 +196,7 @@ public Plugin[] FindPlugins(AssemblyGraph assembly)

foreach (Plugin plugin in plugins)
{
_plugins.Add(plugin);
_plugins.Add(plugin, true);
}

return plugins;
Expand Down
1 change: 1 addition & 0 deletions Source/StructureMap/IInstanceManager.cs
Expand Up @@ -80,5 +80,6 @@ public interface IInstanceManager
object CreateInstance(Type pluginType, string instanceKey);

PLUGINTYPE CreateInstance<PLUGINTYPE>(ExplicitArguments args);
void Inject<PLUGINTYPE>(PLUGINTYPE instance);
}
}
7 changes: 7 additions & 0 deletions Source/StructureMap/InstanceManager.cs
Expand Up @@ -163,6 +163,13 @@ public PLUGINTYPE CreateInstance<PLUGINTYPE>(ExplicitArguments args)

}

public void Inject<PLUGINTYPE>(PLUGINTYPE instance)
{
LiteralMemento memento = new LiteralMemento(instance);
AddInstance<PLUGINTYPE>(memento);
SetDefault(typeof(PLUGINTYPE), memento);
}

public T CreateInstance<T>()
{
return (T) CreateInstance(typeof (T));
Expand Down
4 changes: 1 addition & 3 deletions Source/StructureMap/ObjectFactory.cs
Expand Up @@ -88,9 +88,7 @@ public static string WhatDoIHave()
/// <param name="instance"></param>
public static void Inject<PLUGINTYPE>(PLUGINTYPE instance)
{
LiteralMemento memento = new LiteralMemento(instance);
manager.AddInstance<PLUGINTYPE>(memento);
manager.SetDefault(typeof (PLUGINTYPE), memento);
manager.Inject<PLUGINTYPE>(instance);
}

/// <summary>
Expand Down

0 comments on commit cffd3a6

Please sign in to comment.