From: <jer...@us...> - 2008-02-28 15:00:21
|
Revision: 68 http://structuremap.svn.sourceforge.net/structuremap/?rev=68&view=rev Author: jeremydmiller Date: 2008-02-28 07:00:17 -0800 (Thu, 28 Feb 2008) Log Message: ----------- Fixing the bug with AddInstanceOf<Blah>() creating two instances in the call to GetAllInstances() Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/NormalGraphBuilder.cs trunk/Source/StructureMap/Graph/PluginCollection.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceManager.cs trunk/Source/StructureMap/InstanceManager.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Container/SetterInjectionEmittingTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -97,7 +97,7 @@ _alterations.Add(delegate(PluginFamily family) { - Plugin plugin = family.Plugins.FindOrCreate(typeof (CONCRETETYPE)); + Plugin plugin = family.Plugins.FindOrCreate(typeof (CONCRETETYPE), true); family.DefaultInstanceKey = plugin.ConcreteKey; }); @@ -161,7 +161,7 @@ { Plugin plugin = Plugin.CreateImplicitPlugin(typeof (CONCRETETYPE)); plugin.ConcreteKey = instanceName; - family.Plugins.Add(plugin); + family.Plugins.Add(plugin, true); } ); Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -25,7 +25,10 @@ protected override InstanceMemento memento { - get { return _memento; } + get + { + return _memento; + } } protected override InstanceExpression thisInstance @@ -42,7 +45,7 @@ { Plugin plugin = _pluggedType == null ? family.Plugins[_memento.ConcreteKey] - : family.Plugins.FindOrCreate(_pluggedType); + : family.Plugins.FindOrCreate(_pluggedType, false); _memento.ConcreteKey = plugin.ConcreteKey; } @@ -176,6 +179,7 @@ public InstanceExpression UsingConcreteType<T>() { _parent._pluggedType = typeof (T); + _parent._memento.InstanceKey = typeof (T).Name; return _parent; } Modified: trunk/Source/StructureMap/Configuration/NormalGraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/NormalGraphBuilder.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/Configuration/NormalGraphBuilder.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -159,7 +159,7 @@ Plugin plugin = new Plugin(pluginPath, concreteKey); plugin.DefinitionSource = DefinitionSource.Explicit; - family.Plugins.Add(plugin); + family.Plugins.Add(plugin, true); return plugin; } @@ -200,7 +200,7 @@ Plugin inferredPlugin = memento.CreateInferredPlugin(); if (inferredPlugin != null) { - family.Plugins.Add(inferredPlugin); + family.Plugins.Add(inferredPlugin, true); } family.Source.AddExternalMemento(memento); Modified: trunk/Source/StructureMap/Graph/PluginCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -93,7 +93,7 @@ public void Add(TypePath path, string concreteKey) { Plugin plugin = new Plugin(path, concreteKey); - Add(plugin); + Add(plugin, true); } /// <summary> @@ -105,10 +105,10 @@ 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)) @@ -129,10 +129,12 @@ throw new StructureMapException(114, plugin.PluggedType.FullName, _family.PluginTypeName); } - plugin.AddToSource(_family.Source); + _plugins.Add(plugin.ConcreteKey, plugin); - - _plugins.Add(plugin.ConcreteKey, plugin); + if (addInstanceOfTypeIfPossible) + { + plugin.AddToSource(_family.Source); + } } /// <summary> @@ -162,10 +164,10 @@ } } - public Plugin FindOrCreate(Type pluggedType) + public Plugin FindOrCreate(Type pluggedType, bool createDefaultInstanceOfType) { Plugin plugin = Plugin.CreateImplicitPlugin(pluggedType); - Add(plugin); + Add(plugin, createDefaultInstanceOfType); return plugin; } Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -20,7 +20,7 @@ PluginFamily family = new PluginFamily(pluginType); family.DefinitionSource = DefinitionSource.Implicit; - family.Plugins.Add(plugin); + family.Plugins.Add(plugin, true); family.DefaultInstanceKey = plugin.ConcreteKey; return family; @@ -135,7 +135,7 @@ 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) @@ -196,7 +196,7 @@ foreach (Plugin plugin in plugins) { - _plugins.Add(plugin); + _plugins.Add(plugin, true); } return plugins; Modified: trunk/Source/StructureMap/IInstanceManager.cs =================================================================== --- trunk/Source/StructureMap/IInstanceManager.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/IInstanceManager.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -80,5 +80,6 @@ object CreateInstance(Type pluginType, string instanceKey); PLUGINTYPE CreateInstance<PLUGINTYPE>(ExplicitArguments args); + void Inject<PLUGINTYPE>(PLUGINTYPE instance); } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceManager.cs =================================================================== --- trunk/Source/StructureMap/InstanceManager.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/InstanceManager.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -163,6 +163,13 @@ } + 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)); Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -88,9 +88,7 @@ /// <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> Modified: trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -77,7 +77,7 @@ // 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 Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using NUnit.Framework; using StructureMap.Attributes; using StructureMap.Configuration.DSL; @@ -174,6 +175,39 @@ 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 Modified: trunk/Source/StructureMap.Testing/Container/SetterInjectionEmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Container/SetterInjectionEmittingTester.cs 2008-02-14 15:31:38 UTC (rev 67) +++ trunk/Source/StructureMap.Testing/Container/SetterInjectionEmittingTester.cs 2008-02-28 15:00:17 UTC (rev 68) @@ -54,7 +54,7 @@ { 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"); @@ -69,7 +69,7 @@ { 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"); @@ -86,7 +86,7 @@ { 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"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |