From: <jer...@us...> - 2008-09-14 22:14:22
|
Revision: 149 http://structuremap.svn.sourceforge.net/structuremap/?rev=149&view=rev Author: jeremydmiller Date: 2008-09-14 22:14:18 +0000 (Sun, 14 Sep 2008) Log Message: ----------- StructureMapConfiguration refactoring to start adding some defensive coding checks Modified Paths: -------------- trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Modified: trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -5,8 +5,17 @@ namespace StructureMap.Configuration { - public class ConfigurationParserBuilder + public interface IConfigurationParserBuilder { + bool UseAndEnforceExistenceOfDefaultFile { get; set; } + bool IgnoreDefaultFile { get; set; } + bool PullConfigurationFromAppConfig { get; set; } + void IncludeFile(string filename); + void IncludeNode(XmlNode node, string description); + } + + public class ConfigurationParserBuilder : IConfigurationParserBuilder + { private readonly GraphLog _log; private readonly List<string> _otherFiles = new List<string>(); private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/Container.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; +using StructureMap.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; using StructureMap.Exceptions; @@ -12,6 +13,31 @@ namespace StructureMap { + public class ConfigurationExpression + { + private readonly List<Registry> _registries = new List<Registry>(); + private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); + + internal ConfigurationExpression(PluginGraphBuilder builder) + { + } + + public void AddRegistry(Registry registry) + { + _registries.Add(registry); + } + + public void AddConfigurationFromXmlFile(string fileName) + { + throw new NotImplementedException(); + } + + internal PluginGraph BuildGraph() + { + throw new NotImplementedException(); + } + } + /// <summary> /// A collection of IInstanceFactory's. /// </summary> Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -23,28 +23,25 @@ private static event Notify _notify; /// <summary> - /// Used for testing only (kills singletons). In non-test scenarios, use Reset() instead. - /// </summary> - public static void ReInitialize() - { - _profile = string.Empty; - _notify = null; - _manager = null; - } - - /// <summary> /// Restarts ObjectFactory and blows away all Singleton's and cached instances. Use with caution. /// </summary> public static void Reset() { - _manager = buildManager(); - - if (_notify != null) + lock (_lockObject) { - _notify(); + StructureMapConfiguration.Unseal(); + + _manager = null; + _profile = string.Empty; + + if (_notify != null) + { + _notify(); + } } } + /// <summary> /// Creates an instance of the concrete type specified. Dependencies are inferred from the constructor function of the type /// and automatically "filled" @@ -128,7 +125,7 @@ { if (_manager == null) { - Reset(); + _manager = buildManager(); } } } @@ -214,6 +211,7 @@ private static Container buildManager() { PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); + StructureMapConfiguration.Seal(); Container container = new Container(graph); container.SetDefaultsToProfile(_profile); Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -19,36 +19,64 @@ private static List<Registry> _registries; private static Registry _registry; private static ConfigurationParserBuilder _parserBuilder; + private static bool _sealed = false; + static StructureMapConfiguration() { ResetAll(); } + private static IConfigurationParserBuilder parserBuilder + { + get + { + return _parserBuilder; + } + } + + private static Registry registry + { + get + { + return _registry; + } + } + /// <summary> /// Flag to enable or disable the usage of the default StructureMap.config /// If set to false, StructureMap will not look for a StructureMap.config file /// </summary> public static bool UseDefaultStructureMapConfigFile { - get { return _parserBuilder.UseAndEnforceExistenceOfDefaultFile; } - set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } + get { return parserBuilder.UseAndEnforceExistenceOfDefaultFile; } + set { parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } } public static bool IgnoreStructureMapConfig { - get { return _parserBuilder.IgnoreDefaultFile; } - set { _parserBuilder.IgnoreDefaultFile = value; } + get { return parserBuilder.IgnoreDefaultFile; } + set { parserBuilder.IgnoreDefaultFile = value; } } public static bool PullConfigurationFromAppConfig { - get { return _parserBuilder.PullConfigurationFromAppConfig; } - set { _parserBuilder.PullConfigurationFromAppConfig = value; } + get { return parserBuilder.PullConfigurationFromAppConfig; } + set { parserBuilder.PullConfigurationFromAppConfig = value; } } + /// <summary> + /// Programmatically adds a <StructureMap> node containing Xml configuration + /// </summary> + /// <param name="node"></param> + /// <param name="description">A description of this node source for troubleshooting purposes</param> + public static void IncludeConfigurationFromNode(XmlNode node, string description) + { + parserBuilder.IncludeNode(node, string.Empty); + } + /// <summary> /// Returns the path to the StructureMap.config file /// </summary> @@ -78,6 +106,10 @@ /// </summary> public static void ResetAll() { + PluginCache.ResetAll(); + + _sealed = false; + _log = new GraphLog(); _parserBuilder = new ConfigurationParserBuilder(_log); _registry = new Registry(); @@ -87,18 +119,19 @@ IgnoreStructureMapConfig = false; PluginCache.ResetAll(); + ObjectFactory.Reset(); } public static void RegisterInterceptor(TypeInterceptor interceptor) { - _registry.RegisterInterceptor(interceptor); + registry.RegisterInterceptor(interceptor); } /// <summary> /// Builds a PluginGraph object for the current configuration. Used by ObjectFactory. /// </summary> /// <returns></returns> - public static PluginGraph GetPluginGraph() + internal static PluginGraph GetPluginGraph() { ConfigurationParser[] parsers = _parserBuilder.GetParsers(); @@ -112,26 +145,18 @@ /// <param name="filename"></param> public static void IncludeConfigurationFromFile(string filename) { - _parserBuilder.IncludeFile(filename); + parserBuilder.IncludeFile(filename); } - /// <summary> - /// Programmatically adds a <StructureMap> node containing Xml configuration - /// </summary> - /// <param name="node"></param> - /// <param name="description">A description of this node source for troubleshooting purposes</param> - public static void IncludeConfigurationFromNode(XmlNode node, string description) - { - _parserBuilder.IncludeNode(node, string.Empty); - } + /// <summary> /// Programmatically determine Assembly's to be scanned for attribute configuration /// </summary> /// <returns></returns> public static ScanAssembliesExpression ScanAssemblies() { - return new ScanAssembliesExpression(_registry); + return registry.ScanAssemblies(); } /// <summary> @@ -141,7 +166,7 @@ /// <returns></returns> public static CreatePluginFamilyExpression<PLUGINTYPE> BuildInstancesOf<PLUGINTYPE>() { - return _registry.BuildInstancesOf<PLUGINTYPE>(); + return registry.BuildInstancesOf<PLUGINTYPE>(); } /// <summary> @@ -151,12 +176,12 @@ /// <returns></returns> public static CreatePluginFamilyExpression<PLUGINTYPE> ForRequestedType<PLUGINTYPE>() { - return _registry.BuildInstancesOf<PLUGINTYPE>(); + return registry.BuildInstancesOf<PLUGINTYPE>(); } public static GenericFamilyExpression ForRequestedType(Type pluginType) { - return _registry.ForRequestedType(pluginType); + return registry.ForRequestedType(pluginType); } /// <summary> @@ -167,19 +192,19 @@ [Obsolete] public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { - return _registry.AddInstanceOf<T>(); + return registry.AddInstanceOf<T>(); } [Obsolete] public static void AddInstanceOf<T>(Func<T> func) { - _registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); + registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); } [Obsolete] public static void AddInstanceOf<T>(Instance instance) { - _registry.ForRequestedType<T>().AddInstance(instance); + registry.ForRequestedType<T>().AddInstance(instance); } @@ -193,30 +218,17 @@ [Obsolete] public static LiteralInstance AddInstanceOf<T>(T target) { - return _registry.AddInstanceOf(target); + return registry.AddInstanceOf(target); } /// <summary> - /// Adds a Prototype (GoF) instance of Type T. The actual prototype object must implement the - /// ICloneable interface. When this instance of T is requested, StructureMap will - /// return a cloned copy of the originally registered prototype object. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="prototype"></param> - /// <returns></returns> - public static PrototypeInstance AddPrototypeInstanceOf<T>(T prototype) - { - return _registry.AddPrototypeInstanceOf(prototype); - } - - /// <summary> /// Starts the definition of a configuration Profile. /// </summary> /// <param name="profileName"></param> /// <returns></returns> public static ProfileExpression CreateProfile(string profileName) { - return _registry.CreateProfile(profileName); + return registry.CreateProfile(profileName); } /// <summary> @@ -231,9 +243,18 @@ public static void TheDefaultProfileIs(string profileName) { - _registry.addExpression(graph => graph.ProfileManager.DefaultProfileName = profileName); + registry.addExpression(graph => graph.ProfileManager.DefaultProfileName = profileName); } + internal static void Seal() + { + _sealed = true; + } + + internal static void Unseal() + { + _sealed = false; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -16,7 +16,6 @@ { DataMother.BackupStructureMapConfig(); - ObjectFactory.ReInitialize(); StructureMapConfiguration.ResetAll(); DataMother.WriteDocument("Config1.xml"); DataMother.WriteDocument("Config2.xml"); @@ -27,9 +26,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); - - DataMother.RestoreStructureMapConfig(); } @@ -51,7 +47,6 @@ StructureMapConfiguration.UseDefaultStructureMapConfigFile = true; StructureMapConfiguration.IncludeConfigurationFromNode(doc.DocumentElement, string.Empty); - ObjectFactory.Reset(); IPlug<string> service = ObjectFactory.GetInstance<IPlug<string>>(); Assert.IsNotNull(service); @@ -60,19 +55,11 @@ [Test] public void NotTheDefault() { - try - { - StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; - StructureMapConfiguration.IgnoreStructureMapConfig = true; - StructureMapConfiguration.IncludeConfigurationFromFile("Config1.xml"); - ObjectFactory.Reset(); + StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; + StructureMapConfiguration.IgnoreStructureMapConfig = true; + StructureMapConfiguration.IncludeConfigurationFromFile("Config1.xml"); - assertTheDefault("Orange"); - } - finally - { - DataMother.RestoreStructureMapConfig(); - } + assertTheDefault("Orange"); } [Test] Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -62,12 +62,14 @@ [Test] public void AddInstanceAndOverrideTheConcreteTypeForADependency() { - IContainer manager = new Container( - registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName("AWidgetRule") - .Child<IWidget>().IsConcreteType<AWidget>()); + IContainer container = new Container( + registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>() + .WithName("AWidgetRule") + .Child<IWidget>().IsConcreteType<AWidget>()); - var rule = (WidgetRule) manager.GetInstance<Rule>("AWidgetRule"); - Assert.IsInstanceOfType(typeof (AWidget), rule.Widget); + container.GetInstance<Rule>("AWidgetRule") + .IsType<WidgetRule>() + .Widget.IsType<AWidget>(); } [Test, Explicit] Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -12,7 +12,6 @@ public void SetUp() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -21,7 +21,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion @@ -32,8 +31,6 @@ StructureMapConfiguration.ResetAll(); StructureMapConfiguration.ScanAssemblies().IncludeAssemblyContainingType<RedGreenRegistry>(); - ObjectFactory.Reset(); - List<string> colors = new List<string>(); foreach (IWidget widget in ObjectFactory.GetAllInstances<IWidget>()) { Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -14,14 +14,13 @@ [SetUp] public void SetUp() { - ObjectFactory.Reset(); + StructureMapConfiguration.ResetAll(); } [TearDown] public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -18,7 +18,7 @@ [SetUp] public void SetUp() { - ObjectFactory.ReInitialize(); + ObjectFactory.Reset(); StructureMapConfiguration.ResetAll(); } Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -21,7 +21,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Xml; using NUnit.Framework; using StructureMap.Configuration; @@ -18,7 +19,6 @@ public void SetUp() { DataMother.RestoreStructureMapConfig(); - ObjectFactory.ReInitialize(); StructureMapConfiguration.ResetAll(); } @@ -47,7 +47,6 @@ [Test] public void Ignore_the_StructureMap_config_file_even_if_it_exists() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -93,7 +92,6 @@ [Test] public void StructureMap_functions_without_StructureMapconfig_file_in_the_default_mode() { - StructureMapConfiguration.ResetAll(); DataMother.RemoveStructureMapConfig(); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -114,7 +112,6 @@ [Test] public void Use_the_StructureMap_config_file_if_it_exists() { - StructureMapConfiguration.ResetAll(); DataMother.RestoreStructureMapConfig(); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -124,7 +121,6 @@ [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] public void TheDefaultInstanceIsALambdaForGuidNewGuid() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); @@ -135,7 +131,6 @@ [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] public void TheDefaultInstance_has_a_dependency_upon_a_Guid_NewGuid_lambda_generated_instance() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |