|
From: <jer...@us...> - 2008-05-31 19:47:33
|
Revision: 112
http://structuremap.svn.sourceforge.net/structuremap/?rev=112&view=rev
Author: jeremydmiller
Date: 2008-05-31 12:47:30 -0700 (Sat, 31 May 2008)
Log Message:
-----------
The dynamic addition of assemblies at runtime
Modified Paths:
--------------
trunk/Source/CommonAssemblyInfo.cs
trunk/Source/StructureMap/Container.cs
trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs
trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs
trunk/Source/StructureMap/Graph/PluginCollection.cs
trunk/Source/StructureMap/Graph/PluginFamily.cs
trunk/Source/StructureMap/IContainer.cs
trunk/Source/StructureMap/IInstanceFactory.cs
trunk/Source/StructureMap/InstanceFactory.cs
trunk/Source/StructureMap/Interceptors/InterceptorLibrary.cs
trunk/Source/StructureMap/ObjectFactory.cs
trunk/Source/StructureMap/PipelineGraph.cs
trunk/Source/StructureMap/StructureMap.csproj
trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs
trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs
trunk/Source/StructureMap.Testing/BuildSessionTester.cs
trunk/Source/StructureMap.Testing/Configuration/ConfigurationParserBuilderTester.cs
trunk/Source/StructureMap.Testing/Configuration/ConfigurationParserTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/AddTypesTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/CreateProfileTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/InstanceExpressionTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptAllInstancesOfPluginTypeTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs
trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs
trunk/Source/StructureMap.Testing/Configuration/DefaultInstanceNodeTester.cs
trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs
trunk/Source/StructureMap.Testing/Configuration/InlineInstanceDefinitionInProfileAndMachineNodesTester.cs
trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs
trunk/Source/StructureMap.Testing/Configuration/ProfileBuilderTester.cs
trunk/Source/StructureMap.Testing/Configuration/ShortcuttedInstanceNodeTester.cs
trunk/Source/StructureMap.Testing/DataAccess/Commands/StoredProcedureCommandTester.cs
trunk/Source/StructureMap.Testing/DataAccess/DataSessionTester.cs
trunk/Source/StructureMap.Testing/DataAccess/DataSetMapping/ReaderToColumnMapTester.cs
trunk/Source/StructureMap.Testing/DataAccess/DataSetMapping/ReaderToTableMapperTester.cs
trunk/Source/StructureMap.Testing/DataAccess/Debugging.cs
trunk/Source/StructureMap.Testing/DataAccess/StubbedCommand.cs
trunk/Source/StructureMap.Testing/DataAccess/StubbedReaderSource.cs
trunk/Source/StructureMap.Testing/DataAccess/TemplatedCommandTester.cs
trunk/Source/StructureMap.Testing/DataAccess/Tools/TableDataReaderTester.cs
trunk/Source/StructureMap.Testing/Diagnostics/IntegrationTester.cs
trunk/Source/StructureMap.Testing/Diagnostics/TextReportWriterSmokeTester.cs
trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs
trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs
trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs
trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs
trunk/Source/StructureMap.Testing/Graph/ParameterInfoCollection.cs
trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs
trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs
trunk/Source/StructureMap.Testing/Graph/PluginTester.cs
trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs
trunk/Source/StructureMap.Testing/Graph/TypePathTester.cs
trunk/Source/StructureMap.Testing/ImplicitPluginFromPluggedTypeAttributeTester.cs
trunk/Source/StructureMap.Testing/InstanceBuilderListTester.cs
trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs
trunk/Source/StructureMap.Testing/MementoTester.cs
trunk/Source/StructureMap.Testing/MergingTester.cs
trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs
trunk/Source/StructureMap.Testing/ObjectMother.cs
trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs
trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/LiteralInstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerMergeTester.cs
trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs
trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs
trunk/Source/StructureMap.Testing/Pipeline/PrototypeInstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs
trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs
trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs
trunk/Source/StructureMap.Testing/Pipeline/TypeRulesTester.cs
trunk/Source/StructureMap.Testing/PipelineGraphTester.cs
trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj
trunk/Source/StructureMap.Testing/StructureMapConfigCreator.cs
trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs
trunk/Source/StructureMap.Testing/TestData/DataMother.cs
trunk/Source/StructureMap.Testing/TestUtility.cs
trunk/Source/StructureMap.Testing/XmlWriting/ElementChecker.cs
Added Paths:
-----------
trunk/Source/StructureMap/Util/
trunk/Source/StructureMap/Util/Cache.cs
trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs
trunk/Source/StructureMap.Testing/Graph/ContainerConstructorAttributeTester.cs
trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs
trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs
trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs
trunk/Source/StructureMap.Testing/Graph/EnumerationTester.cs
trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs
trunk/Source/StructureMap.Testing/Graph/FillDependenciesTester.cs
trunk/Source/StructureMap.Testing/Graph/FullStackFacadeTester.cs
trunk/Source/StructureMap.Testing/Graph/ImplicitDefaultTest.cs
trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs
trunk/Source/StructureMap.Testing/Graph/IntegratedTester.cs
trunk/Source/StructureMap.Testing/Graph/PluggableAttributeTester.cs
trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs
trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs
trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs
trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs
Removed Paths:
-------------
trunk/Source/StructureMap.Testing/Container/
Modified: trunk/Source/CommonAssemblyInfo.cs
===================================================================
--- trunk/Source/CommonAssemblyInfo.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/CommonAssemblyInfo.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,4 +1,3 @@
-using System;
using System.Reflection;
using System.Runtime.InteropServices;
@@ -12,11 +11,10 @@
// </auto-generated>
//------------------------------------------------------------------------------
-[assembly: ComVisibleAttribute(false)]
-[assembly: AssemblyVersionAttribute("2.5.0.0000")]
-[assembly: AssemblyCopyrightAttribute("Copyright (c) 2007, Jeremy D. Miller")]
-[assembly: AssemblyProductAttribute("StructureMap")]
-[assembly: AssemblyCompanyAttribute("")]
-[assembly: AssemblyConfigurationAttribute("release")]
-[assembly: AssemblyInformationalVersionAttribute("2.5.0.0000")]
-
+[assembly : ComVisible(false)]
+[assembly : AssemblyVersion("2.5.0.0000")]
+[assembly : AssemblyCopyright("Copyright (c) 2007, Jeremy D. Miller")]
+[assembly : AssemblyProduct("StructureMap")]
+[assembly : AssemblyCompany("")]
+[assembly : AssemblyConfiguration("release")]
+[assembly : AssemblyInformationalVersion("2.5.0.0000")]
\ No newline at end of file
Modified: trunk/Source/StructureMap/Container.cs
===================================================================
--- trunk/Source/StructureMap/Container.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Container.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -90,22 +90,6 @@
_pipelineGraph.Inject(instance);
}
- public void InjectByName<PLUGINTYPE>(PLUGINTYPE instance, string instanceKey)
- {
- LiteralInstance literalInstance = new LiteralInstance(instance);
- literalInstance.Name = instanceKey;
-
- AddInstance<PLUGINTYPE>(literalInstance);
- }
-
- public void InjectByName<PLUGINTYPE, CONCRETETYPE>(string instanceKey)
- {
- ConfiguredInstance instance = new ConfiguredInstance(typeof(CONCRETETYPE));
- instance.Name = instanceKey;
-
- AddInstance<PLUGINTYPE>(instance);
- }
-
public T GetInstance<T>()
{
return (T) GetInstance(typeof (T));
@@ -118,9 +102,14 @@
public void InjectStub<T>(T instance)
{
- InjectStub(typeof (T), instance);
+ Inject<T>(instance);
}
+ public void InjectStub<T>(string name, T instance)
+ {
+ throw new NotImplementedException();
+ }
+
public IList<T> GetAllInstances<T>()
{
List<T> list = new List<T>();
@@ -180,7 +169,7 @@
/// </summary>
/// <param name="pluginType"></param>
/// <param name="instance"></param>
- public void SetDefault(Type pluginType, Instance instance)
+ public void Inject(Type pluginType, Instance instance)
{
_pipelineGraph.SetDefault(pluginType, instance);
}
@@ -196,7 +185,22 @@
_pipelineGraph.SetDefault(pluginType, reference);
}
+ public void SetDefault(Type pluginType, Instance instance)
+ {
+ _pipelineGraph.SetDefault(pluginType, instance);
+ }
+ public void SetDefault<T>(Instance instance)
+ {
+ SetDefault(typeof(T), instance);
+ }
+
+ public void SetDefault<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE
+ {
+ SetDefault<PLUGINTYPE>(new ConfiguredInstance(typeof(CONCRETETYPE)));
+ }
+
+
/// <summary>
/// Attempts to create a new instance of the requested type. Automatically inserts the default
/// configured instance for each dependency in the StructureMap constructor function.
@@ -243,19 +247,20 @@
return forType(type).GetAllInstances(withNewSession());
}
- public void AddInstance<T>(Instance instance)
+ public void Configure(Action<Registry> configure)
{
- _pipelineGraph.AddInstance<T>(instance);
- }
+ lock (this)
+ {
+ Registry registry = new Registry();
+ configure(registry);
- public void AddInstance<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE
- {
- _pipelineGraph.AddInstance<PLUGINTYPE, CONCRETETYPE>();
- }
+ PluginGraph graph = registry.Build();
- public void AddDefaultInstance<PLUGINTYPE, CONCRETETYPE>()
- {
- _pipelineGraph.AddDefaultInstance<PLUGINTYPE, CONCRETETYPE>();
+ graph.Log.AssertFailures();
+
+ _interceptorLibrary.ImportFrom(graph.InterceptorLibrary);
+ _pipelineGraph.ImportFrom(graph);
+ }
}
public string WhatDoIHave()
Modified: trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs
===================================================================
--- trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -12,19 +12,9 @@
public class BuildInstanceMethod : Method
{
private readonly Plugin _plugin;
- //private readonly ConstructorInfo _constructor;
- //private readonly ParameterEmitter _parameterEmitter;
public BuildInstanceMethod(Plugin plugin) : base()
{
- //_constructor = plugin.GetConstructor();
-
- //_parameterEmitter = new StringParameterEmitter();
-
- //_parameterEmitter.AttachNextSibling(new PrimitiveParameterEmitter());
- //_parameterEmitter.AttachNextSibling(new EnumParameterEmitter());
- //_parameterEmitter.AttachNextSibling(new ChildParameterEmitter());
- //_parameterEmitter.AttachNextSibling(new ChildArrayParameterEmitter());
_plugin = plugin;
}
Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs
===================================================================
--- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,18 +1,27 @@
using System;
using System.Collections.Generic;
using StructureMap.Pipeline;
+using StructureMap.Util;
namespace StructureMap.Graph
{
public class GenericsPluginGraph
{
- private readonly Dictionary<Type, PluginFamily> _families;
+ private readonly Cache<Type, PluginFamily> _families;
public GenericsPluginGraph()
{
- _families = new Dictionary<Type, PluginFamily>();
+ _families = new Cache<Type, PluginFamily>(delegate(Type pluginType)
+ {
+ return new PluginFamily(pluginType);
+ });
}
+ public int FamilyCount
+ {
+ get { return _families.Count; }
+ }
+
public static bool CanBeCast(Type pluginType, Type pluggedType)
{
try
@@ -64,7 +73,7 @@
public void AddFamily(PluginFamily family)
{
- _families.Add(family.PluginType, family);
+ _families.Store(family.PluginType, family);
}
@@ -72,9 +81,9 @@
{
Type basicType = templatedType.GetGenericTypeDefinition();
- if (_families.ContainsKey(basicType))
+ if (_families.Has(basicType))
{
- PluginFamily basicFamily = _families[basicType];
+ PluginFamily basicFamily = _families.Retrieve(basicType);
Type[] templatedParameterTypes = templatedType.GetGenericArguments();
profileManager.CopyDefaults(basicType, templatedType);
@@ -106,13 +115,14 @@
}
// TODO -- Got a big problem here. Intances need to be copied over
- foreach (IDiagnosticInstance instance in baseFamily.GetAllInstances())
+ baseFamily.EachInstance(delegate(Instance i)
{
+ IDiagnosticInstance instance = i;
if (instance.CanBePartOfPluginFamily(templatedFamily))
{
- templatedFamily.AddInstance((Instance) instance);
+ templatedFamily.AddInstance((Instance)instance);
}
- }
+ });
// Need to attach the new PluginFamily to the old PluginGraph
baseFamily.Parent.PluginFamilies.Add(templatedFamily);
@@ -169,5 +179,24 @@
}
return isValid;
}
+
+ public void ImportFrom(GenericsPluginGraph source)
+ {
+ foreach (PluginFamily sourceFamily in source._families)
+ {
+ ImportFrom(sourceFamily);
+ }
+ }
+
+ public void ImportFrom(PluginFamily sourceFamily)
+ {
+ PluginFamily destinationFamily = FindFamily(sourceFamily.PluginType);
+ destinationFamily.ImportFrom(sourceFamily);
+ }
+
+ public PluginFamily FindFamily(Type pluginType)
+ {
+ return _families.Retrieve(pluginType);
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Graph/PluginCollection.cs
===================================================================
--- trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using StructureMap.Util;
namespace StructureMap.Graph
{
@@ -10,7 +11,7 @@
public class PluginCollection : IEnumerable<Plugin>
{
private readonly PluginFamily _family;
- private readonly Dictionary<Type, Plugin> _plugins = new Dictionary<Type, Plugin>();
+ private readonly Cache<Type, Plugin> _plugins = new Cache<Type, Plugin>();
public PluginCollection(PluginFamily family)
{
@@ -21,10 +22,7 @@
{
get
{
- Plugin[] returnValue = new Plugin[_plugins.Count];
- _plugins.Values.CopyTo(returnValue, 0);
-
- return returnValue;
+ return _plugins.GetAll();
}
}
@@ -34,13 +32,13 @@
}
/// <summary>
- /// Gets a Plugin by its PluggedType
+ /// Gets a Plugin by its pluggedType
/// </summary>
- /// <param name="PluggedType"></param>
+ /// <param name="pluggedType"></param>
/// <returns></returns>
- public Plugin this[Type PluggedType]
+ public Plugin this[Type pluggedType]
{
- get { return _plugins[PluggedType]; }
+ get { return _plugins.Retrieve(pluggedType); }
}
/// <summary>
@@ -52,15 +50,10 @@
{
get
{
- foreach (KeyValuePair<Type, Plugin> pair in _plugins)
+ return _plugins.Find(delegate(Plugin plugin)
{
- if (pair.Value.ConcreteKey == concreteKey)
- {
- return pair.Value;
- }
- }
-
- return null;
+ return plugin.ConcreteKey == concreteKey;
+ });
}
}
@@ -68,7 +61,7 @@
IEnumerator<Plugin> IEnumerable<Plugin>.GetEnumerator()
{
- return _plugins.Values.GetEnumerator();
+ return _plugins.GetEnumerator();
}
public IEnumerator GetEnumerator()
@@ -81,7 +74,7 @@
public void Add(Plugin plugin)
{
- if (_plugins.ContainsKey(plugin.PluggedType))
+ if (_plugins.Has(plugin.PluggedType))
{
Plugin peer = this[plugin.PluggedType];
peer.MergeSetters(plugin);
@@ -99,7 +92,8 @@
throw new StructureMapException(104, plugin.PluggedType, _family.PluginType);
}
- _plugins.Add(plugin.PluggedType, plugin);
+
+ _plugins.Store(plugin.PluggedType, plugin);
}
/// <summary>
@@ -130,20 +124,25 @@
public List<Plugin> FindAutoFillablePlugins()
{
List<Plugin> list = new List<Plugin>();
- foreach (Plugin plugin in _plugins.Values)
+ _plugins.Each(delegate(Plugin plugin)
{
if (plugin.CanBeAutoFilled)
{
list.Add(plugin);
}
- }
+ });
return list;
}
public bool HasPlugin(Type pluggedType)
{
- return _plugins.ContainsKey(pluggedType);
+ return _plugins.Has(pluggedType);
}
+
+ public void Fill(Plugin plugin)
+ {
+ _plugins.Fill(plugin.PluggedType, plugin);
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs
===================================================================
--- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using StructureMap.Attributes;
using StructureMap.Pipeline;
+using StructureMap.Util;
namespace StructureMap.Graph
{
@@ -14,7 +15,7 @@
{
private readonly Predicate<Type> _explicitlyMarkedPluginFilter;
private readonly Predicate<Type> _implicitPluginFilter;
- private readonly List<Instance> _instances = new List<Instance>();
+ private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate { return null; });
private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>();
private readonly PluginCollection _plugins;
private readonly Type _pluginType;
@@ -99,7 +100,7 @@
public void AddInstance(Instance instance)
{
- _instances.Add(instance);
+ _instances.Store(instance.Name, instance);
}
@@ -117,7 +118,7 @@
_parent.Log.Try(delegate()
{
Instance instance = memento.ReadInstance(Parent, _pluginType);
- _instances.Add(instance);
+ AddInstance(instance);
}).AndLogAnyErrors();
});
@@ -127,28 +128,28 @@
if (_instances.Count == 1)
{
- _defaultKey = _instances[0].Name;
+ _defaultKey = _instances.First.Name;
}
}
private void validatePluggabilityOfInstances()
{
- foreach (Instance instance in _instances)
+ _instances.Each(delegate(Instance instance)
{
IDiagnosticInstance diagnosticInstance = instance;
_parent.Log.Try(delegate()
{
- diagnosticInstance.Preprocess(this);
+ diagnosticInstance.Preprocess(this);
})
.AndReportErrorAs(104, diagnosticInstance.CreateToken(), _pluginType);
-
+
if (!diagnosticInstance.CanBePartOfPluginFamily(this))
{
_parent.Log.RegisterError(104, diagnosticInstance.CreateToken(), _pluginType);
}
- }
+ });
}
private void discoverImplicitInstances()
@@ -164,14 +165,14 @@
}
}
- public Instance[] GetAllInstances()
+ public void EachInstance(Action<Instance> action)
{
- return _instances.ToArray();
+ _instances.Each(action);
}
public Instance GetInstance(string name)
{
- return _instances.Find(delegate(Instance i) { return i.Name == name; });
+ return _instances.Retrieve(name);
}
@@ -192,12 +193,17 @@
return _plugins.HasPlugin(pluggedType);
}
- public void AddPlugin(Type pluggedType)
+ public Plugin AddPlugin(Type pluggedType)
{
if (!HasPlugin(pluggedType))
{
- AddPlugin(new Plugin(pluggedType));
+ Plugin plugin = new Plugin(pluggedType);
+ AddPlugin(plugin);
+
+ return plugin;
}
+
+ return Plugins[pluggedType];
}
public Plugin AddPlugin(Type pluggedType, string key)
@@ -270,6 +276,11 @@
set { _defaultKey = value ?? string.Empty; }
}
+ public int InstanceCount
+ {
+ get { return _instances.Count; }
+ }
+
#endregion
public Plugin FindPlugin(Type pluggedType)
@@ -313,5 +324,23 @@
profile.FillTypeInto(PluginType, defaultInstance);
}
+
+ public void ImportFrom(PluginFamily source)
+ {
+ source.EachInstance(delegate(Instance instance)
+ {
+ _instances.Fill(instance.Name, instance);
+ });
+
+ foreach (Plugin plugin in source.Plugins)
+ {
+ Plugins.Fill(plugin);
+ }
+ }
+
+ public Instance FirstInstance()
+ {
+ return _instances.First;
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/IContainer.cs
===================================================================
--- trunk/Source/StructureMap/IContainer.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/IContainer.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using StructureMap.Configuration.DSL;
using StructureMap.Pipeline;
namespace StructureMap
@@ -11,43 +12,30 @@
T GetInstance<T>();
T FillDependencies<T>();
object FillDependencies(Type type);
- void InjectStub<T>(T instance);
+
IList<T> GetAllInstances<T>();
- void SetDefaultsToProfile(string profile);
+
T GetInstance<T>(Instance instance);
- /// <summary>
- /// Sets up the Container to return the object in the "stub" argument anytime
- /// any instance of the PluginType is requested
- /// </summary>
- /// <param name="pluginType"></param>
- /// <param name="stub"></param>
- void InjectStub(Type pluginType, object stub);
-
IList GetAllInstances(Type type);
- void AddInstance<T>(Instance instance);
- void AddInstance<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE;
- void AddDefaultInstance<PLUGINTYPE, CONCRETETYPE>();
+
+ void Configure(Action<Registry> configure);
void Inject<PLUGINTYPE>(PLUGINTYPE instance);
- void InjectByName<PLUGINTYPE>(PLUGINTYPE instance, string instanceKey);
- void InjectByName<PLUGINTYPE, CONCRETETYPE>(string instanceKey);
+ void InjectStub(Type pluginType, object stub);
+ void InjectStub<T>(T instance);
+ void InjectStub<T>(string name, T instance);
+ void SetDefault(Type pluginType, string instanceKey);
+ void SetDefault(Type pluginType, Instance instance);
+ void SetDefault<T>(Instance instance);
+ void SetDefault<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE;
+ void SetDefaultsToProfile(string profile);
+
string WhatDoIHave();
- /// <summary>
- /// Sets the default instance for the PluginType
- /// </summary>
- /// <param name="pluginType"></param>
- /// <param name="instance"></param>
- void SetDefault(Type pluginType, Instance instance);
- /// <summary>
- /// Sets the default instance for the PluginType
- /// </summary>
- /// <param name="pluginType"></param>
- /// <param name="instanceKey"></param>
- void SetDefault(Type pluginType, string instanceKey);
+
/// <summary>
/// Creates a new object instance of the requested type
Modified: trunk/Source/StructureMap/IInstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/IInstanceFactory.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using StructureMap.Graph;
using StructureMap.Pipeline;
namespace StructureMap
@@ -21,5 +22,6 @@
InstanceBuilder FindBuilderByType(Type pluggedType);
InstanceBuilder FindBuilderByConcreteKey(string concreteKey);
void ForEachInstance(Action<Instance> action);
+ void ImportFrom(PluginFamily family);
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/InstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/InstanceFactory.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/InstanceFactory.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -1,8 +1,8 @@
using System;
using System.Collections;
-using System.Collections.Generic;
using StructureMap.Graph;
using StructureMap.Pipeline;
+using StructureMap.Util;
namespace StructureMap
{
@@ -12,7 +12,10 @@
public class InstanceFactory : IInstanceFactory
{
private readonly InstanceBuilderList _instanceBuilders;
- private readonly Dictionary<string, Instance> _instances = new Dictionary<string, Instance>();
+
+ private readonly Cache<string, Instance> _instances =
+ new Cache<string, Instance>(delegate { return null; });
+
private readonly Type _pluginType;
private readonly IBuildPolicy _policy = new BuildPolicy();
@@ -20,7 +23,6 @@
public InstanceFactory(Type pluginType) : this(new PluginFamily(pluginType))
{
-
}
/// <summary>
@@ -41,10 +43,8 @@
_pluginType = family.PluginType;
_instanceBuilders = new InstanceBuilderList(family.PluginType, family.Plugins.All);
- foreach (Instance instance in family.GetAllInstances())
- {
- AddInstance(instance);
- }
+
+ family.EachInstance(delegate(Instance instance) { AddInstance(instance); });
}
catch (StructureMapException)
{
@@ -93,29 +93,21 @@
public void ForEachInstance(Action<Instance> action)
{
- foreach (KeyValuePair<string, Instance> pair in _instances)
- {
- action(pair.Value);
- }
+ _instances.Each(action);
}
public void AddInstance(Instance instance)
{
- if (_instances.ContainsKey(instance.Name))
- {
- _instances[instance.Name] = instance;
- }
- else
- {
- _instances.Add(instance.Name, instance);
- }
+ _instances.Store(instance.Name, instance);
}
- [Obsolete] public Instance AddType<T>()
+ [Obsolete]
+ public Instance AddType<T>()
{
InstanceBuilder builder = _instanceBuilders.FindByType(typeof (T));
- ConfiguredInstance instance = new ConfiguredInstance(typeof(T)).WithName(TypePath.GetAssemblyQualifiedName(typeof(T)));
+ ConfiguredInstance instance =
+ new ConfiguredInstance(typeof (T)).WithName(TypePath.GetAssemblyQualifiedName(typeof (T)));
AddInstance(instance);
@@ -126,11 +118,11 @@
{
IList list = new ArrayList();
- foreach (KeyValuePair<string, Instance> pair in _instances)
+ _instances.Each(delegate(Instance instance)
{
- object instance = Build(session, pair.Value);
- list.Add(instance);
- }
+ object builtObject = Build(session, instance);
+ list.Add(builtObject);
+ });
return list;
}
@@ -142,28 +134,18 @@
public Instance FindInstance(string name)
{
- if (!_instances.ContainsKey(name))
- {
- return null;
- }
-
- return _instances[name];
+ return _instances.Retrieve(name);
}
#endregion
- public void Merge(PluginFamily family)
+ public void ImportFrom(PluginFamily family)
{
_instanceBuilders.Add(family.Plugins);
- foreach (Instance instance in family.GetAllInstances())
+ family.EachInstance(delegate(Instance instance)
{
- if (_instances.ContainsKey(instance.Name))
- {
- continue;
- }
-
- AddInstance(instance);
- }
+ _instances.Fill(instance.Name, instance);
+ });
}
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Interceptors/InterceptorLibrary.cs
===================================================================
--- trunk/Source/StructureMap/Interceptors/InterceptorLibrary.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/Interceptors/InterceptorLibrary.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -18,6 +18,15 @@
_interceptors.Add(interceptor);
}
+ public void ImportFrom(InterceptorLibrary source)
+ {
+ lock (_locker)
+ {
+ _analyzedInterceptors.Clear();
+ _interceptors.AddRange(source._interceptors);
+ }
+ }
+
public CompoundInterceptor FindInterceptor(Type type)
{
if (_analyzedInterceptors.ContainsKey(type))
Modified: trunk/Source/StructureMap/ObjectFactory.cs
===================================================================
--- trunk/Source/StructureMap/ObjectFactory.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/ObjectFactory.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Security.Permissions;
+using StructureMap.Configuration.DSL;
using StructureMap.Graph;
using StructureMap.Pipeline;
@@ -85,50 +86,6 @@
manager.Inject<PLUGINTYPE>(instance);
}
- /// <summary>
- /// Injects a new instance of PLUGINTYPE by name.
- /// </summary>
- /// <typeparam name="PLUGINTYPE"></typeparam>
- /// <param name="instance"></param>
- /// <param name="instanceKey"></param>
- public static void InjectByName<PLUGINTYPE>(PLUGINTYPE instance, string instanceKey)
- {
- manager.InjectByName<PLUGINTYPE>(instance, instanceKey);
- }
-
- /// <summary>
- /// Injects a new instance of CONCRETETYPE to PLUGINTYPE by name.
- /// </summary>
- /// <typeparam name="PLUGINTYPE"></typeparam>
- /// <typeparam name="CONCRETETYPE"></typeparam>
- /// <param name="instanceKey"></param>
- public static void InjectByName<PLUGINTYPE, CONCRETETYPE>(string instanceKey)
- {
- manager.InjectByName<PLUGINTYPE, CONCRETETYPE>(instanceKey);
- }
-
- /// <summary>
- /// StructureMap will return an instance of CONCRETETYPE whenever
- /// a PLUGINTYPE is requested
- /// </summary>
- /// <typeparam name="PLUGINTYPE"></typeparam>
- /// <typeparam name="CONCRETETYPE"></typeparam>
- public static void InjectDefaultType<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE
- {
- manager.AddDefaultInstance<PLUGINTYPE, CONCRETETYPE>();
- }
-
- /// <summary>
- /// Adds a new CONCRETETYPE to StructureMap so that an instance of CONCRETETYPE
- /// will be returned from a call to ObjectFactory.GetAllInstance<PLUGINTYPE>()
- /// </summary>
- /// <typeparam name="PLUGINTYPE"></typeparam>
- /// <typeparam name="CONCRETETYPE"></typeparam>
- public static void AddType<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE
- {
- manager.AddInstance<PLUGINTYPE, CONCRETETYPE>();
- }
-
#region Container and setting defaults
private static IContainer manager
@@ -184,12 +141,32 @@
/// Strictly used for testing scenarios
/// </summary>
/// <param name="manager"></param>
- internal static void ReplaceManager(IContainer manager)
+ internal static void ReplaceManager(IContainer container)
{
- _manager = manager;
+ _manager = container;
}
+ public static void Configure(Action<Registry> configure)
+ {
+ manager.Configure(configure);
+ }
+ public static void SetDefault(Type pluginType, Instance instance)
+ {
+ manager.SetDefault(pluginType, instance);
+ }
+
+ public static void SetDefault<PLUGINTYPE>(Instance instance)
+ {
+ manager.SetDefault<PLUGINTYPE>(instance);
+ }
+
+ public static void SetDefault<PLUGINTYPE, CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE
+ {
+ manager.SetDefault<PLUGINTYPE, CONCRETETYPE>();
+ }
+
+
/// <summary>
/// Fires when the ObjectFactory is refreshed
/// </summary>
Modified: trunk/Source/StructureMap/PipelineGraph.cs
===================================================================
--- trunk/Source/StructureMap/PipelineGraph.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/PipelineGraph.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -42,6 +42,23 @@
}
}
+ public void ImportFrom(PluginGraph graph)
+ {
+ foreach (PluginFamily family in graph.PluginFamilies)
+ {
+ if (family.IsGenericTemplate)
+ {
+ _genericsGraph.ImportFrom(family);
+ }
+ else
+ {
+ ForType(family.PluginType).ImportFrom(family);
+ }
+ }
+
+ _profileManager.ImportFrom(graph.ProfileManager);
+ }
+
public MissingFactoryFunction OnMissingFactory
{
set { _missingFactory = value; }
Modified: trunk/Source/StructureMap/StructureMap.csproj
===================================================================
--- trunk/Source/StructureMap/StructureMap.csproj 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap/StructureMap.csproj 2008-05-31 19:47:30 UTC (rev 112)
@@ -376,6 +376,7 @@
<Compile Include="ErrorMessages.cs" />
<Compile Include="Pipeline\ConfiguredInstance.Building.cs" />
<Compile Include="Pipeline\IStructuredInstance.cs" />
+ <Compile Include="Util\Cache.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
Added: trunk/Source/StructureMap/Util/Cache.cs
===================================================================
--- trunk/Source/StructureMap/Util/Cache.cs (rev 0)
+++ trunk/Source/StructureMap/Util/Cache.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -0,0 +1,153 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using StructureMap.Graph;
+
+namespace StructureMap.Util
+{
+ public class Cache<KEY, VALUE> : IEnumerable<VALUE> where VALUE : class
+ {
+ private readonly Dictionary<KEY, VALUE> _values = new Dictionary<KEY, VALUE>();
+ private readonly Func<KEY, VALUE> _onMissing = delegate(KEY key)
+ {
+ string message = string.Format("Key '{0}' could not be found", key);
+ throw new KeyNotFoundException(message);
+ };
+
+ private Func<VALUE, KEY> _getKey = delegate { throw new NotImplementedException(); };
+
+ public Cache()
+ {
+ }
+
+ public Cache(Func<KEY, VALUE> onMissing)
+ {
+ _onMissing = onMissing;
+ }
+
+ public Func<VALUE, KEY> GetKey
+ {
+ get { return _getKey; }
+ set { _getKey = value; }
+ }
+
+ public int Count
+ {
+ get
+ {
+ return _values.Count;
+ }
+ }
+
+ public VALUE First
+ {
+ get
+ {
+ foreach (KeyValuePair<KEY, VALUE> pair in _values)
+ {
+ return pair.Value;
+ }
+
+ return null;
+ }
+ }
+
+ public void Store(KEY key, VALUE value)
+ {
+ if (_values.ContainsKey(key))
+ {
+ _values[key] = value;
+ }
+ else
+ {
+ _values.Add(key, value);
+ }
+ }
+
+ public void Fill(KEY key, VALUE value)
+ {
+ if (_values.ContainsKey(key))
+ {
+ return;
+ }
+
+ _values.Add(key, value);
+ }
+
+ public VALUE Retrieve(KEY key)
+ {
+ if (!_values.ContainsKey(key))
+ {
+ VALUE value = _onMissing(key);
+ _values.Add(key, value);
+ }
+
+ return _values[key];
+ }
+
+ public void Each(Action<VALUE> action)
+ {
+ foreach (KeyValuePair<KEY, VALUE> pair in _values)
+ {
+ action(pair.Value);
+ }
+ }
+
+ public bool Has(KEY key)
+ {
+ return _values.ContainsKey(key);
+ }
+
+ public bool Exists(Predicate<VALUE> predicate)
+ {
+ bool returnValue = false;
+
+ Each(delegate(VALUE value)
+ {
+ returnValue |= predicate(value);
+ });
+
+ return returnValue;
+ }
+
+ public VALUE Find(Predicate<VALUE> predicate)
+ {
+ foreach (KeyValuePair<KEY, VALUE> pair in _values)
+ {
+ if (predicate(pair.Value))
+ {
+ return pair.Value;
+ }
+ }
+
+ return null;
+ }
+
+ public VALUE[] GetAll()
+ {
+ VALUE[] returnValue = new VALUE[Count];
+ _values.Values.CopyTo(returnValue, 0);
+
+ return returnValue;
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return ((IEnumerable<VALUE>) this).GetEnumerator();
+ }
+
+ public IEnumerator<VALUE> GetEnumerator()
+ {
+ return _values.Values.GetEnumerator();
+ }
+
+ public void Remove(KEY key)
+ {
+ if (_values.ContainsKey(key))
+ {
+ _values.Remove(key);
+ }
+ }
+ }
+}
Modified: trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -4,9 +4,7 @@
using Rhino.Mocks.Constraints;
using StructureMap.Attributes;
using StructureMap.Graph;
-using StructureMap.Interceptors;
using StructureMap.Pipeline;
-using StructureMap.Source;
namespace StructureMap.Testing.Attributes
{
@@ -18,9 +16,9 @@
PluginFamilyAttribute att = new PluginFamilyAttribute("something");
att.Scope = scope;
- PluginFamily family = new PluginFamily(typeof(TypeThatDoesNotHaveCustomMementoSource));
+ PluginFamily family = new PluginFamily(typeof (TypeThatDoesNotHaveCustomMementoSource));
att.Configure(family);
-
+
Assert.IsInstanceOfType(interceptorType, family.Policy);
}
@@ -85,7 +83,7 @@
using (mocks.Record())
{
- SetupResult.For(family.PluginType).Return(typeof(TypeThatDoesNotHaveCustomMementoSource));
+ SetupResult.For(family.PluginType).Return(typeof (TypeThatDoesNotHaveCustomMementoSource));
family.AddMementoSource(null);
LastCall.Repeat.Never();
@@ -97,7 +95,7 @@
}
}
-
+
[Test]
public void PerRequest_DoesNot_call_SetScopeTo_on_family()
{
Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -137,7 +137,7 @@
IMockedService3 service3 = _container.GetInstance<IMockedService3>();
ConcreteClass concreteClass = _container.FillDependencies<ConcreteClass>();
-
+
Assert.AreSame(service, concreteClass.Service);
Assert.AreSame(service2, concreteClass.Service2);
Assert.AreSame(service3, concreteClass.Service3);
Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -33,28 +33,58 @@
}
}
+ public class WidgetHolder
+ {
+ private readonly IWidget[] _widgets;
+
+ public WidgetHolder(IWidget[] widgets)
+ {
+ _widgets = widgets;
+ }
+
+ public IWidget[] Widgets
+ {
+ get { return _widgets; }
+ }
+ }
+
[Test]
- public void Throw_200_When_trying_to_build_an_instance_that_cannot_be_found()
+ public void Get_a_unique_value_for_each_individual_buildsession()
{
- PipelineGraph graph = new PipelineGraph(new PluginGraph());
+ int count = 0;
- assertActionThrowsErrorCode(200, delegate()
+ BuildSession session = new BuildSession(new PluginGraph());
+ BuildSession session2 = new BuildSession(new PluginGraph());
+ ConstructorInstance instance = new ConstructorInstance(delegate
{
- BuildSession session = new BuildSession(graph, null);
- session.CreateInstance(typeof (IGateway), "A Name");
+ count++;
+ return new ColorRule("Red");
});
+
+ object result1 = session.CreateInstance(typeof (ColorRule), instance);
+ object result2 = session.CreateInstance(typeof (ColorRule), instance);
+ object result3 = session2.CreateInstance(typeof (ColorRule), instance);
+ object result4 = session2.CreateInstance(typeof (ColorRule), instance);
+
+ Assert.AreEqual(2, count);
+
+ Assert.AreSame(result1, result2);
+ Assert.AreNotSame(result1, result3);
+ Assert.AreSame(result3, result4);
}
[Test]
- public void When_calling_CreateInstance_if_no_default_can_be_found_throw_202()
+ public void If_no_child_array_is_explicitly_defined_return_all_instances()
{
- PipelineGraph graph = new PipelineGraph(new PluginGraph());
-
- assertActionThrowsErrorCode(202, delegate()
+ IContainer manager = new Container(delegate(Registry registry)
{
- BuildSession session = new BuildSession(graph, null);
- session.CreateInstance(typeof (IGateway));
+ registry.AddInstanceOf<IWidget>(new ColorWidget("Red"));
+ registry.AddInstanceOf<IWidget>(new ColorWidget("Blue"));
+ registry.AddInstanceOf<IWidget>(new ColorWidget("Green"));
});
+
+ WidgetHolder holder = manager.GetInstance<WidgetHolder>();
+ Assert.AreEqual(3, holder.Widgets.Length);
}
[Test]
@@ -63,7 +93,7 @@
int count = 0;
BuildSession session = new BuildSession(new PluginGraph());
- ConstructorInstance instance = new ConstructorInstance(delegate()
+ ConstructorInstance instance = new ConstructorInstance(delegate
{
count++;
return new ColorRule("Red");
@@ -73,7 +103,7 @@
object result2 = session.CreateInstance(typeof (ColorRule), instance);
object result3 = session.CreateInstance(typeof (ColorRule), instance);
object result4 = session.CreateInstance(typeof (ColorRule), instance);
-
+
Assert.AreEqual(1, count);
Assert.AreSame(result1, result2);
@@ -86,7 +116,7 @@
{
int count = 0;
- ConstructorInstance instance = new ConstructorInstance(delegate()
+ ConstructorInstance instance = new ConstructorInstance(delegate
{
count++;
return new ColorRule("Red");
@@ -98,10 +128,10 @@
BuildSession session = new BuildSession(graph);
- object result1 = session.CreateInstance(typeof(ColorRule));
- object result2 = session.CreateInstance(typeof(ColorRule));
- object result3 = session.CreateInstance(typeof(ColorRule));
- object result4 = session.CreateInstance(typeof(ColorRule));
+ object result1 = session.CreateInstance(typeof (ColorRule));
+ object result2 = session.CreateInstance(typeof (ColorRule));
+ object result3 = session.CreateInstance(typeof (ColorRule));
+ object result4 = session.CreateInstance(typeof (ColorRule));
Assert.AreEqual(1, count);
@@ -111,57 +141,27 @@
}
[Test]
- public void Get_a_unique_value_for_each_individual_buildsession()
+ public void Throw_200_When_trying_to_build_an_instance_that_cannot_be_found()
{
- int count = 0;
+ PipelineGraph graph = new PipelineGraph(new PluginGraph());
- BuildSession session = new BuildSession(new PluginGraph());
- BuildSession session2 = new BuildSession(new PluginGraph());
- ConstructorInstance instance = new ConstructorInstance(delegate()
+ assertActionThrowsErrorCode(200, delegate
{
- count++;
- return new ColorRule("Red");
+ BuildSession session = new BuildSession(graph, null);
+ session.CreateInstance(typeof (IGateway), "A Name");
});
-
- object result1 = session.CreateInstance(typeof(ColorRule), instance);
- object result2 = session.CreateInstance(typeof(ColorRule), instance);
- object result3 = session2.CreateInstance(typeof(ColorRule), instance);
- object result4 = session2.CreateInstance(typeof(ColorRule), instance);
-
- Assert.AreEqual(2, count);
-
- Assert.AreSame(result1, result2);
- Assert.AreNotSame(result1, result3);
- Assert.AreSame(result3, result4);
}
[Test]
- public void If_no_child_array_is_explicitly_defined_return_all_instances()
+ public void When_calling_CreateInstance_if_no_default_can_be_found_throw_202()
{
- IContainer manager = new StructureMap.Container(delegate(Registry registry)
+ PipelineGraph graph = new PipelineGraph(new PluginGraph());
+
+ assertActionThrowsErrorCode(202, delegate
{
- registry.AddInstanceOf<IWidget>(new ColorWidget("Red"));
- registry.AddInstanceOf<IWidget>(new ColorWidget("Blue"));
- registry.AddInstanceOf<IWidget>(new ColorWidget("Green"));
+ BuildSession session = new BuildSession(graph, null);
+ session.CreateInstance(typeof (IGateway));
});
-
- WidgetHolder holder = manager.GetInstance<WidgetHolder>();
- Assert.AreEqual(3, holder.Widgets.Length);
}
-
- public class WidgetHolder
- {
- private readonly IWidget[] _widgets;
-
- public WidgetHolder(IWidget[] widgets)
- {
- _widgets = widgets;
- }
-
- public IWidget[] Widgets
- {
- get { return _widgets; }
- }
- }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap.Testing/Configuration/ConfigurationParserBuilderTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Configuration/ConfigurationParserBuilderTester.cs 2008-05-30 16:36:24 UTC (rev 111)
+++ trunk/Source/StructureMap.Testing/Configuration/ConfigurationParserBuilderTester.cs 2008-05-31 19:47:30 UTC (rev 112)
@@ -53,13 +53,23 @@
Converter<ConfigurationParser, string> converter =
delegate(ConfigurationParser parser) { return parser.Id; };
- string[] actuals = Array.ConvertAll<ConfigurationParser, string>(parsers, converter);
+ string[] actuals = Array.ConvertAll(parsers, converter);
Array.Sort(actuals);
Assert.AreEqual(expected, actuals);
}
[Test]
+ public void Do_NOT_Log_exception_100_if_StructureMap_config_is_required_and_missing()
+ {
+ assertNoErrorIsLogged(100, delegate
+ {
+ DataMother.RemoveStructureMapConfig();
+ builder.UseAndEnforceExistenceOfDefaultFile = false;
+ });
+ }
+
+ [Test]
public void DoNotUseDefaultAndUseADifferentFile()
{
DataMother.RemoveStructureMapConfig();
@@ -74,124 +84,107 @@
}
[Test]
- public void Put_the_file_name_onto_ConfigurationParser()
+ public void GetIncludes()
{
+ DataMother.RemoveStructureMapConfig();
+
+ DataMother.WriteDocument("Include1.xml");
+ DataMother.WriteDocument("Include2.xml");
+ DataMother.WriteDocument("Master.xml");
+
builder.UseAndEnforceExistenceOfDefaultFile = false;
builder.IgnoreDefaultFile = true;
+ builder.IncludeFile("Master.xml");
+ assertParserIdList("Include1", "Include2", "Master");
+ }
+
+ [Test]
+ public void GetMultiples()
+ {
+ DataMother.WriteDocument("Include1.xml");
+ DataMother.WriteDocument("Include2.xml");
+ DataMother.WriteDocument("Master.xml");
+
DataMother.WriteDocument("GenericsTesting.xml");
builder.IncludeFile("GenericsTesting.xml");
+ builder.UseAndEnforceExistenceOfDefaultFile = true;
+ builder.IncludeFile("Master.xml");
- ConfigurationParser[] parsers = builder.GetParsers();
- Assert.AreEqual("GenericsTesting.xml", parsers[0].Description);
+ assertParserIdList("Generics", "Include1", "Include2", "Main", "Master");
}
[Test]
public void If_adding_a_node_directly_use_stacktrace_to_get_the_node()
{
-
}
[Test]
- public void Log_exception_100_if_StructureMap_config_is_required_and_missing()
+ public void Log_error_150_if_a_designated_Include_cannot_be_opened()
{
- assertErrorIsLogged(100, delegate()
- {
- DataMother.RemoveStructureMapConfig();
- builder.UseAndEnforceExistenceOfDefaultFile = true;
- });
- }
+ assertErrorIsLogged(150, delegate
+ {
+ builder.IncludeFile("Master.xml");
- [Test]
- public void Do_NOT_Log_exception_100_if_StructureMap_config_is_required_and_missing()
- {
- assertNoErrorIsLogged(100, delegate()
- {
- DataMother.RemoveStructureMapConfig();
- builder.UseAndEnforceExistenceOfDefaultFile = false;
- });
+ DataMother.WriteDocument("Include1.xml");
+ File.Delete("Include2.xml");
+ DataMother.WriteDocument("Master.xml");
+
+ builder.IgnoreDefaultFile = true;
+ });
}
[Test]
- public void Log_exception_160_if_additional_file_cannot_be_opened()
+ public void Log_error_156_if_Include_node_does_not_have_a_File()
{
- assertErrorIsLogged(160, delegate()
- {
- builder.IncludeFile("FileThatDoesNotExist.xml");
- });
+ DataMother.WriteDocument("MissingInclude.xml", "<StructureMap><Include></Include></StructureMap>");
+ assertErrorIsLogged(156, delegate { builder.IncludeFile("MissingInclude.xml"); });
}
[Test]
- public void Log_exception_160_if_file_is_malformed()
+ public void Log_exception_100_if_StructureMap_config_is_required_and_missing()
{
- assertErrorIsLogged(160, delegate()
- {
- XmlDocument doc = new XmlDocument();
- doc.LoadXml("<a></a>");
- doc.Save("Malformed.xml");
- builder.IncludeFile("Malformed.xml");
- });
+ assertErrorIsLogged(100, delegate
+ {
+ DataMother.RemoveStructureMapConfig();
+ builder.UseAndEnforceExistenceOfDefaultFile = true;
+ });
}
-
[Test]
- public void Log_error_150_if_a_designated_Include_cannot_be_opened()
+ public void Log_exception_160_if_additional_file_cannot_be_opened()
{
- assertErrorIsLogged(150, delegate()
- {
- builder.IncludeFile("Master.xml");
-
- DataMother.WriteDocument("Include1.xml");
- File.Delete("Include2.xml");
- DataMother.WriteDocument("Master.xml");
-
- builder.IgnoreDefaultFile = true;
- });
+ assertErrorIsLogged(160, delegate { builder.IncludeFile("FileThatDoesNotExist.xml"); });
}
[Test]
- public void Log_error_156_if_Include_node_does_not_have_a_File()
+ public void Log_exception_160_if_file_is_malformed()
{
- DataMother.WriteDocument("MissingInclude.xml", "<StructureMap><Include></Include></StructureMap>");
- assertErrorIsLogged(156, delegate()
- {
- builder.IncludeFile("MissingInclude.xml");
- });
+ assertErrorIsLogged(160, delegate
+ {
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml("<a></a>");
+ doc.Save("Malformed.xml");
+ builder.IncludeFile("Malformed.xml");
+ });
}
[Test]
- public void GetIncludes()
+ public void Put_the_file_name_onto_ConfigurationParser()
{
- DataMother.RemoveStructureMapConfig();
-
- DataMother.WriteDocument("Include1.xml");
- DataMother.WriteDocument("Include2.xml");
- DataMother.WriteDocument("Master.xml");
-
builder....
[truncated message content] |