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] |