From: <jer...@us...> - 2008-09-15 01:47:41
|
Revision: 150 http://structuremap.svn.sourceforge.net/structuremap/?rev=150&view=rev Author: jeremydmiller Date: 2008-09-15 01:47:31 +0000 (Mon, 15 Sep 2008) Log Message: ----------- ObjectFactory.Initialize Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Added Paths: ----------- trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Container.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; +using System.Xml; using StructureMap.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; @@ -13,15 +14,53 @@ namespace StructureMap { - public class ConfigurationExpression + public class InitializationExpression : ConfigurationExpression { + internal InitializationExpression() + { + _parserBuilder.IgnoreDefaultFile = false; + DefaultProfileName = string.Empty; + } + + public bool UseDefaultStructureMapConfigFile + { + set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } + } + + public bool IgnoreStructureMapConfig + { + set { _parserBuilder.IgnoreDefaultFile = value; } + } + + public bool PullConfigurationFromAppConfig + { + set { _parserBuilder.PullConfigurationFromAppConfig = value; } + } + + public string DefaultProfileName { get; set; } + } + + public class ConfigurationExpression : Registry + { + protected readonly GraphLog _log = new GraphLog(); private readonly List<Registry> _registries = new List<Registry>(); - private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); + protected readonly ConfigurationParserBuilder _parserBuilder; - internal ConfigurationExpression(PluginGraphBuilder builder) + internal ConfigurationExpression() { + _parserBuilder = new ConfigurationParserBuilder(_log); + _parserBuilder.IgnoreDefaultFile = true; + _parserBuilder.PullConfigurationFromAppConfig = false; + + _registries.Add(this); + } + public void AddRegistry<T>() where T : Registry, new() + { + AddRegistry(new T()); + } + public void AddRegistry(Registry registry) { _registries.Add(registry); @@ -29,12 +68,29 @@ public void AddConfigurationFromXmlFile(string fileName) { - throw new NotImplementedException(); + _parserBuilder.IncludeFile(fileName); } + public void AddConfigurationFromNode(XmlNode node) + { + _parserBuilder.IncludeNode(node, "Xml configuration"); + } + + public bool IncludeConfigurationFromConfigFile + { + set + { + _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; + } + + } + internal PluginGraph BuildGraph() { - throw new NotImplementedException(); + var parsers = _parserBuilder.GetParsers(); + PluginGraphBuilder builder = new PluginGraphBuilder(parsers, _registries.ToArray(), _log); + + return builder.Build(); } } @@ -46,12 +102,12 @@ private InterceptorLibrary _interceptorLibrary; private PipelineGraph _pipelineGraph; - public Container(Action<Registry> action) + public Container(Action<ConfigurationExpression> action) { - Registry registry = new Registry(); - action(registry); + ConfigurationExpression expression = new ConfigurationExpression(); + action(expression); - construct(registry.Build()); + construct(expression.BuildGraph()); } public Container(Registry registry) : this(registry.Build()) Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -41,7 +41,22 @@ } } + public static void Initialize(Action<InitializationExpression> action) + { + lock (typeof(ObjectFactory)) + { + InitializationExpression expression = new InitializationExpression(); + action(expression); + var graph = expression.BuildGraph(); + StructureMapConfiguration.Seal(); + + _manager = new Container(graph); + Profile = expression.DefaultProfileName; + } + } + + /// <summary> /// Creates an instance of the concrete type specified. Dependencies are inferred from the constructor function of the type /// and automatically "filled" Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -29,30 +29,6 @@ } - protected void mergeIntoThis(ConfiguredInstance instance) - { - _pluggedType = instance._pluggedType; - - foreach (KeyValuePair<string, string> pair in instance._properties) - { - if (!_properties.ContainsKey(pair.Key)) - { - _properties.Add(pair.Key, pair.Value); - } - } - - foreach (KeyValuePair<string, Instance> pair in instance._children) - { - if (!_children.ContainsKey(pair.Key)) - { - _children.Add(pair.Key, pair.Value); - } - } - - _arrays = instance._arrays; - } - - protected override void preprocess(PluginFamily family) { Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -1,11 +1,21 @@ using System; +using System.Collections; using System.Collections.Generic; using StructureMap.Graph; namespace StructureMap.Pipeline { - public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance + public interface Copyable { + Type PluggedType { get; } + Dictionary<string, string> Properties { get; } + Dictionary<string, Instance> Children { get; } + Dictionary<string, Instance[]> Arrays { get; } + } + + + public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance, Copyable + { protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); protected Dictionary<string, string> _properties = new Dictionary<string, string>(); protected Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); @@ -35,6 +45,8 @@ get { return _pluggedType; } } + + Instance IStructuredInstance.GetChild(string name) { return _children[name]; @@ -196,5 +208,48 @@ { setChildArray(name, children); } + + protected void mergeIntoThis(Copyable instance) + { + _pluggedType = instance.PluggedType; + + foreach (KeyValuePair<string, string> pair in instance.Properties) + { + if (!_properties.ContainsKey(pair.Key)) + { + _properties.Add(pair.Key, pair.Value); + } + } + + foreach (KeyValuePair<string, Instance> pair in instance.Children) + { + if (!_children.ContainsKey(pair.Key)) + { + _children.Add(pair.Key, pair.Value); + } + } + + _arrays = instance.Arrays; + } + + Type Copyable.PluggedType + { + get { return _pluggedType; } + } + + Dictionary<string, string> Copyable.Properties + { + get { return _properties; } + } + + Dictionary<string, Instance> Copyable.Children + { + get { return _children; } + } + + Dictionary<string, Instance[]> Copyable.Arrays + { + get { return _arrays; } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -81,7 +81,7 @@ args.Configure(this); _args = args; - ConfiguredInstance defaultConfiguration = defaultInstance as ConfiguredInstance; + Copyable defaultConfiguration = defaultInstance as Copyable; if (defaultConfiguration != null) { mergeIntoThis(defaultConfiguration); Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -12,6 +12,7 @@ namespace StructureMap { + [Obsolete("Please put configuration into Registry classes and use the ObjectFactory.Initialize() method for configuring the container")] public static class StructureMapConfiguration { private const string CONFIG_FILE_NAME = "StructureMap.config"; @@ -27,10 +28,19 @@ ResetAll(); } + private static void assertIsNotSealed() + { + if (_sealed) + { + throw new StructureMapException(50); + } + } + private static IConfigurationParserBuilder parserBuilder { get { + assertIsNotSealed(); return _parserBuilder; } } @@ -39,6 +49,7 @@ { get { + assertIsNotSealed(); return _registry; } } @@ -81,7 +92,7 @@ /// Returns the path to the StructureMap.config file /// </summary> /// <returns></returns> - public static string GetStructureMapConfigurationPath() + internal static string GetStructureMapConfigurationPath() { string basePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; string configPath = Path.Combine(basePath, CONFIG_FILE_NAME); @@ -189,19 +200,16 @@ /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> - [Obsolete] public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { return registry.AddInstanceOf<T>(); } - [Obsolete] public static void AddInstanceOf<T>(Func<T> func) { registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); } - [Obsolete] public static void AddInstanceOf<T>(Instance instance) { registry.ForRequestedType<T>().AddInstance(instance); @@ -215,7 +223,6 @@ /// <typeparam name="T"></typeparam> /// <param name="target"></param> /// <returns></returns> - [Obsolete] public static LiteralInstance AddInstanceOf<T>(T target) { return registry.AddInstanceOf(target); @@ -238,6 +245,7 @@ /// <param name="registry"></param> public static void AddRegistry(Registry registry) { + assertIsNotSealed(); _registries.Add(registry); } Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/StructureMapException.resx 2008-09-15 01:47:31 UTC (rev 150) @@ -256,4 +256,7 @@ <data name="280" xml:space="preserve"> <value>Requested Profile {0} cannot be found</value> </data> + <data name="50" xml:space="preserve"> + <value>StructureMapConfiguration cannot be used after ObjectFactory is initialized</value> + </data> </root> \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -11,7 +11,7 @@ { private readonly Thing _prototype = new Thing(4, "Jeremy", .333, new WidgetRule(new ColorWidget("yellow"))); - private void assertThingMatches(Action<Registry> action) + private void assertThingMatches(Action<ConfigurationExpression> action) { IContainer manager = new Container(action); Thing actual = manager.GetInstance<Thing>(); Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -143,6 +143,25 @@ } [Test] + public void NowDoItWithObjectFactoryItself_with_new_API() + { + ObjectFactory.Initialize(x => + { + x.ForRequestedType<ExplicitTarget>().TheDefault.Is.OfConcreteType<ExplicitTarget>() + .CtorDependency<IProvider>().Is(child => child.OfConcreteType<RedProvider>()) + .WithCtorArg("name").EqualTo("Jeremy"); + }); + + // Get the ExplicitTarget without setting an explicit arg for IProvider + ObjectFactory.GetInstance<ExplicitTarget>().Provider.IsType<RedProvider>(); + + // Now, set the explicit arg for IProvider + var theBlueProvider = new BlueProvider(); + ObjectFactory.With<IProvider>(theBlueProvider).GetInstance<ExplicitTarget>() + .Provider.ShouldBeTheSameAs(theBlueProvider); + } + + [Test] public void OverrideAPrimitiveWithObjectFactory() { StructureMapConfiguration.ForRequestedType<ExplicitTarget>().TheDefaultIs( Added: trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using NUnit.Framework; +using StructureMap.Configuration; +using StructureMap.Graph; +using StructureMap.Testing.GenericWidgets; +using StructureMap.Testing.TestData; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing +{ + [TestFixture] + public class ObjectFactoryInitializeTester + { + private static XmlNode createNodeFromText(string outerXml) + { + XmlDocument document = new XmlDocument(); + document.LoadXml(outerXml); + return document.DocumentElement; + } + + + + [Test] + public void PullConfigurationFromTheAppConfig() + { + ObjectFactory.Initialize(x => + { + x.UseDefaultStructureMapConfigFile = false; + x.PullConfigurationFromAppConfig = true; + }); + + ObjectFactory.GetInstance<IThing<string, bool>>() + .IsType<ColorThing<string, bool>>().Color.ShouldEqual("Cornflower"); + } + + + [Test] + public void StructureMap_functions_without_StructureMapconfig_file_in_the_default_mode() + { + DataMother.RemoveStructureMapConfig(); + + ObjectFactory.Initialize(x => { }); + } + + + + [Test] + public void TheDefaultNameIs_should_set_the_default_profile_name() + { + string theDefaultProfileName = "the default profile"; + + ObjectFactory.Initialize(x => + { + x.CreateProfile(theDefaultProfileName).For<IGateway>().Use(() => null); + + x.IgnoreStructureMapConfig = true; + x.DefaultProfileName = theDefaultProfileName; + }); + + ObjectFactory.Profile.ShouldEqual(theDefaultProfileName); + } + + + } +} Modified: trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -17,41 +17,12 @@ [SetUp] public void SetUp() { - _event = new ManualResetEvent(false); - DataMother.WriteDocument("FullTesting.XML"); + DataMother.RestoreStructureMapConfig(); + ObjectFactory.Initialize(x => x.UseDefaultStructureMapConfigFile = true); } #endregion - private ManualResetEvent _event; - - private void markDone() - { - _event.Set(); - } - - private void modifyXml(string Color) - { - XmlDocument doc = new XmlDocument(); - doc.Load("StructureMap.config"); - XmlNode node = - doc.DocumentElement.SelectSingleNode("PluginFamily[@Type='StructureMap.Testing.Widget.Rule']"); - node.Attributes["DefaultKey"].Value = Color; - doc.Save("StructureMap.config"); - } - - private void timeout() - { - Thread thread = new Thread(signal); - thread.Start(); - } - - private void signal() - { - Thread.Sleep(500); - _event.Set(); - } - [Test] public void SmokeTestGetAllInstances() { Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-09-15 01:47:31 UTC (rev 150) @@ -349,6 +349,7 @@ <Compile Include="InstanceMementoInstanceCreationTester.cs" /> <Compile Include="MementoTester.cs" /> <Compile Include="MergingTester.cs" /> + <Compile Include="ObjectFactoryInitializeTester.cs" /> <Compile Include="ObjectFactoryTester.cs"> <SubType>Code</SubType> </Compile> @@ -381,6 +382,7 @@ </Compile> <Compile Include="SpecificationExtensions.cs" /> <Compile Include="StructureMapConfigCreator.cs" /> + <Compile Include="StructureMapConfigurationDefensiveChecksTester.cs" /> <Compile Include="StructureMapConfigurationTester.cs" /> <Compile Include="TestData\DataMother.cs"> <SubType>Code</SubType> Added: trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing +{ + [TestFixture] + public class StructureMapConfigurationDefensiveChecksTester + { + private void shouldThrowExceptionWhenSealed(Action action) + { + StructureMapConfiguration.ResetAll(); + StructureMapConfiguration.Seal(); + + try + { + action(); + Assert.Fail("Should have thrown exception"); + } + catch (StructureMapException ex) + { + ex.ErrorCode.ShouldEqual(50); + } + } + + [Test] + public void Ensure_defensive_check_is_always_thrown_when_StructureMapConfiguration_is_sealed() + { + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.AddInstanceOf<IGateway>()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.AddRegistry(null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.BuildInstancesOf<IGateway>()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.CreateProfile("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.ForRequestedType(typeof(IGateway))); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IgnoreStructureMapConfig = true); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IncludeConfigurationFromFile("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IncludeConfigurationFromNode(null, null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.PullConfigurationFromAppConfig = true); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.RegisterInterceptor(null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.ScanAssemblies()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.TheDefaultProfileIs("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.UseDefaultStructureMapConfigFile = true); + } + } +} Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -48,10 +48,7 @@ public void Ignore_the_StructureMap_config_file_even_if_it_exists() { StructureMapConfiguration.IgnoreStructureMapConfig = true; - - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assert.AreEqual(0, graph.FamilyCount); + StructureMapConfiguration.GetPluginGraph().FamilyCount.ShouldEqual(0); } @@ -61,9 +58,8 @@ StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; StructureMapConfiguration.PullConfigurationFromAppConfig = true; - ColorThing<string, bool> thing = - (ColorThing<string, bool>) ObjectFactory.GetInstance<IThing<string, bool>>(); - Assert.AreEqual("Cornflower", thing.Color, "Cornflower is the color from the App.config file"); + ObjectFactory.GetInstance<IThing<string, bool>>() + .IsType<ColorThing<string, bool>>().Color.ShouldEqual("Cornflower"); } @@ -94,7 +90,7 @@ { DataMother.RemoveStructureMapConfig(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); + StructureMapConfiguration.GetPluginGraph().ShouldNotBeNull(); } [Test] @@ -106,16 +102,14 @@ StructureMapConfiguration.TheDefaultProfileIs(theDefaultProfileName); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - Assert.AreEqual(theDefaultProfileName, graph.ProfileManager.DefaultProfileName); + graph.ProfileManager.DefaultProfileName.ShouldEqual(theDefaultProfileName); } [Test] public void Use_the_StructureMap_config_file_if_it_exists() { DataMother.RestoreStructureMapConfig(); - - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - Assert.IsTrue(graph.FamilyCount > 0); + StructureMapConfiguration.GetPluginGraph().FamilyCount.ShouldBeGreaterThan(0); } [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")] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |