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