From: <jer...@us...> - 2008-12-22 14:58:19
|
Revision: 212 http://structuremap.svn.sourceforge.net/structuremap/?rev=212&view=rev Author: jeremydmiller Date: 2008-12-22 14:57:59 +0000 (Mon, 22 Dec 2008) Log Message: ----------- Fixed a minor problem with explicit arguments and concrete classes Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Extensions.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/TypeRules.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs Added Paths: ----------- trunk/Source/StructureMap/TypeExtensions.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/Container.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -109,6 +109,11 @@ { Instance defaultInstance = _pipelineGraph.GetDefault(pluginType); + if (defaultInstance == null && pluginType.IsConcrete()) + { + defaultInstance = new ConfiguredInstance(pluginType); + } + BasicInstance basicInstance = defaultInstance as BasicInstance; Instance instance = basicInstance == null ? defaultInstance : new ExplicitInstance(pluginType, args, basicInstance); Modified: trunk/Source/StructureMap/Extensions.cs =================================================================== --- trunk/Source/StructureMap/Extensions.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/Extensions.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -5,7 +5,7 @@ namespace StructureMap { - public static class StringExtensions + internal static class StringExtensions { public static string ToFormat(this string template, params object[] parameters) { Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -7,14 +7,6 @@ namespace StructureMap.Graph { - public static class TypeExtensions - { - public static bool IsInNamespace(this Type type, string nameSpace) - { - return type.Namespace.StartsWith(nameSpace); - } - } - public interface IAssemblyScanner { #region Designating Assemblies Modified: trunk/Source/StructureMap/Graph/TypeRules.cs =================================================================== --- trunk/Source/StructureMap/Graph/TypeRules.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/Graph/TypeRules.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -76,7 +76,7 @@ return type.IsPrimitive && !IsString(type) && type != typeof (IntPtr); } - protected bool IsSimple(Type type) + protected internal bool IsSimple(Type type) { return type.IsPrimitive || IsString(type) || IsEnum(type); } @@ -101,7 +101,7 @@ return type.IsArray && IsSimple(type.GetElementType()); } - protected bool IsConcrete(Type type) + protected internal bool IsConcrete(Type type) { return !type.IsInterface && !type.IsAbstract; } @@ -112,4 +112,6 @@ return IsChild(type) || IsChildArray(type); } } + + } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -5,14 +5,6 @@ namespace StructureMap.Pipeline { - public static class TypeExtensions - { - public static ReferencedInstance GetReferenceTo(this Type type) - { - string key = PluginCache.GetPlugin(type).ConcreteKey; - return new ReferencedInstance(key); - } - } public interface IInstance { Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-12-22 14:57:59 UTC (rev 212) @@ -406,6 +406,7 @@ <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluggableAttributeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> + <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> <Compile Include="Model.cs" /> Added: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs (rev 0) +++ trunk/Source/StructureMap/TypeExtensions.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -0,0 +1,25 @@ +using System; +using StructureMap.Graph; +using StructureMap.Pipeline; + +namespace StructureMap +{ + public static class TypeExtensions + { + public static bool IsInNamespace(this Type type, string nameSpace) + { + return type.Namespace.StartsWith(nameSpace); + } + + public static ReferencedInstance GetReferenceTo(this Type type) + { + string key = PluginCache.GetPlugin(type).ConcreteKey; + return new ReferencedInstance(key); + } + + public static bool IsConcrete(this Type type) + { + return new TypeRules().IsConcrete(type); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2008-12-21 16:31:48 UTC (rev 211) +++ trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2008-12-22 14:57:59 UTC (rev 212) @@ -16,7 +16,10 @@ [SetUp] public void SetUp() { - ObjectFactory.Initialize(x => { x.UseDefaultStructureMapConfigFile = false; }); + ObjectFactory.Initialize(x => + { + x.UseDefaultStructureMapConfigFile = false; + }); } #endregion @@ -381,6 +384,14 @@ args.SetArg("age", 34); Assert.AreEqual(34, args.GetArg("age")); } + + [Test] + public void can_build_a_concrete_class_with_constructor_args_that_is_not_previously_registered() + { + var container = new Container(); + container.With("name").EqualTo("Jeremy").GetInstance<ConcreteThatNeedsString>() + .Name.ShouldEqual("Jeremy"); + } } public class Lump @@ -485,4 +496,19 @@ get { return _trade; } } } + + public class ConcreteThatNeedsString + { + private string _name; + + public ConcreteThatNeedsString(string name) + { + _name = name; + } + + public string Name + { + get { return _name; } + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-01-19 18:57:40
|
Revision: 225 http://structuremap.svn.sourceforge.net/structuremap/?rev=225&view=rev Author: jeremydmiller Date: 2009-01-19 18:57:33 +0000 (Mon, 19 Jan 2009) Log Message: ----------- some attribute changes for Azure support Modified Paths: -------------- trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Properties/AssemblyInfo.cs trunk/Source/StructureMap.Testing/Configuration/ProfileBuilderTester.cs Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2009-01-19 18:49:29 UTC (rev 224) +++ trunk/Source/StructureMap/ObjectFactory.cs 2009-01-19 18:57:33 UTC (rev 225) @@ -12,7 +12,7 @@ /// <summary> /// The main static Facade for the StructureMap container /// </summary> - [EnvironmentPermission(SecurityAction.Assert, Read = "COMPUTERNAME")] + //[EnvironmentPermission(SecurityAction.Assert, Read = "COMPUTERNAME")] public static class ObjectFactory { private static readonly object _lockObject = new object(); Modified: trunk/Source/StructureMap/Properties/AssemblyInfo.cs =================================================================== --- trunk/Source/StructureMap/Properties/AssemblyInfo.cs 2009-01-19 18:49:29 UTC (rev 224) +++ trunk/Source/StructureMap/Properties/AssemblyInfo.cs 2009-01-19 18:57:33 UTC (rev 225) @@ -1,5 +1,6 @@ using System.Reflection; using System.Runtime.CompilerServices; +using System.Security; // // General Information about an assembly is controlled through the following @@ -16,4 +17,6 @@ [assembly: InternalsVisibleTo( "StructureMap.Testing, PublicKey=00240000048000009400000006020000002400005253413100040000010001008d9a2a76e43cd9b1b1944b1f3b489a046b33f0bcd755b25cc5d3ed7b18ded38240d6db7578cd986c72d3feb4f94a7ab26fcfa41e3e4f41cf2c029fba91159db05c44d63f0b2bfac24353a07f4a1230dd3d4240340adafa2275277fa083c75958062cd0e60016701db6af7ae718efdf1e802a840595b49c290964255b3c60c494" - )] \ No newline at end of file + )] + +[assembly: AllowPartiallyTrustedCallers] \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/ProfileBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/ProfileBuilderTester.cs 2009-01-19 18:49:29 UTC (rev 224) +++ trunk/Source/StructureMap.Testing/Configuration/ProfileBuilderTester.cs 2009-01-19 18:57:33 UTC (rev 225) @@ -22,6 +22,12 @@ private PluginGraph _graph; private ProfileBuilder _builder; private const string THE_MACHINE_NAME = "TheMachineName"; + + [Test] + public void smoke_test_get_machine_name() + { + ProfileBuilder.GetMachineName().ShouldNotBeEmpty(); + } [Test] public void Do_not_register_a_machine_override_if_it_is_NOT_the_matching_machine() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-01-21 00:53:15
|
Revision: 226 http://structuremap.svn.sourceforge.net/structuremap/?rev=226&view=rev Author: jeremydmiller Date: 2009-01-21 00:53:11 +0000 (Wed, 21 Jan 2009) Log Message: ----------- marked some methods on PluginGraph virtual for testability concerns Modified Paths: -------------- trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/BuildUpBug.cs Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-01-19 18:57:33 UTC (rev 225) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-01-21 00:53:11 UTC (rev 226) @@ -178,7 +178,7 @@ /// </summary> /// <param name="pluginType"></param> /// <param name="concreteType"></param> - public void AddType(Type pluginType, Type concreteType) + public virtual void AddType(Type pluginType, Type concreteType) { FindFamily(pluginType).AddType(concreteType); } @@ -189,7 +189,7 @@ /// <param name="pluginType"></param> /// <param name="concreteType"></param> /// <param name="name"></param> - public void AddType(Type pluginType, Type concreteType, string name) + public virtual void AddType(Type pluginType, Type concreteType, string name) { FindFamily(pluginType).AddType(concreteType, name); } @@ -199,7 +199,7 @@ /// could be assigned to the pluginType /// </summary> /// <param name="pluggedType"></param> - public void AddType(Type pluggedType) + public virtual void AddType(Type pluggedType) { _pluggedTypes.Add(pluggedType); } Added: trunk/Source/StructureMap.Testing/Bugs/BuildUpBug.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/BuildUpBug.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/BuildUpBug.cs 2009-01-21 00:53:11 UTC (rev 226) @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class StructureMapTests + { + [Test] + public void Test() + { + ObjectFactory.Initialize(x => + { + x.UseDefaultStructureMapConfigFile = false; + + x.ForConcreteType<SomeDbRepository>().Configure. + WithCtorArg("connectionString").EqualTo("some connection string"); + + //x.ForConcreteType<SomeWebPage>().Configure. + // SetterDependency<SomeDbRepository>().Is<SomeDbRepository>(); + + x.SetAllProperties(o => o.OfType<SomeDbRepository>()); + }); + + SomeDbRepository dbRepository = + ObjectFactory.GetInstance<SomeDbRepository>(); + + SomeWebPage webPage = new SomeWebPage(); + + ObjectFactory.BuildUp(webPage); + + webPage.DbRepository.ConnectionString.ShouldEqual("some connection string"); + } + } + + public class SomeDbRepository + { + public SomeDbRepository(string connectionString) + { + this.ConnectionString = connectionString; + } + + public string ConnectionString { get; set; } + + // ... + } + + public class SomeWebPage + { + public SomeDbRepository DbRepository { get; set; } + + // ... + } +} Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-01-19 18:57:33 UTC (rev 225) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-01-21 00:53:11 UTC (rev 226) @@ -179,6 +179,7 @@ <Compile Include="AutoMocking\RhinoAutoMockerTester.cs" /> <Compile Include="AutoMocking\RhinoMockRepositoryProxyTester.cs" /> <Compile Include="AutoWiringExamples.cs" /> + <Compile Include="Bugs\BuildUpBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> <Compile Include="Bugs\ScanIndexerBugTester.cs" /> <Compile Include="Bugs\SingletonShouldBeLazy.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fli...@us...> - 2009-01-22 22:33:26
|
Revision: 227 http://structuremap.svn.sourceforge.net/structuremap/?rev=227&view=rev Author: flimflan Date: 2009-01-22 22:33:20 +0000 (Thu, 22 Jan 2009) Log Message: ----------- Applied patch from Weston Binford to suppress noisy documentation warnings. Cleaned up "real" warnings. Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Configuration/GraphBuilder.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/InitializationExpression.cs trunk/Source/StructureMap/InstanceBuilder.cs trunk/Source/StructureMap/Model.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConditionalInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/DefaultInstance.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.AutoMocking/AutoMocker.cs trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConditionalInstanceTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -100,8 +100,6 @@ family.AddInstance(instance); family.DefaultInstanceKey = instance.Name; }); - - return this; } /// <summary> @@ -193,7 +191,7 @@ /// <summary> /// Register a Func to run against any object of this PluginType immediately after it is created, - /// but before the new object is passed back to the caller. Unlike <see cref="OnCreation">OnCreation()</see>, + /// but before the new object is passed back to the caller. Unlike <see cref="OnCreation(Action{PLUGINTYPE})">OnCreation()</see>, /// EnrichWith() gives the the ability to return a different object. Use this method for runtime AOP /// scenarios or to return a decorator. /// </summary> @@ -215,7 +213,7 @@ /// <summary> /// Register a Func to run against any object of this PluginType immediately after it is created, - /// but before the new object is passed back to the caller. Unlike <see cref="OnCreation">OnCreation()</see>, + /// but before the new object is passed back to the caller. Unlike <see cref="OnCreation(Action{IContext,PLUGINTYPE})">OnCreation()</see>, /// EnrichWith() gives the the ability to return a different object. Use this method for runtime AOP /// scenarios or to return a decorator. /// </summary> Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -15,13 +15,14 @@ IInstanceExpression<T> Is { get; } /// <summary> - /// Shortcut to specify a prebuilt Instance + /// Register a previously built Instance. This provides a "catch all" + /// method to attach custom Instance objects. Synonym for Instance() /// </summary> /// <param name="instance"></param> void IsThis(Instance instance); /// <summary> - /// Shortcut to directly inject an object + /// Inject this object directly. Synonym to Object() /// </summary> /// <param name="obj"></param> /// <returns></returns> @@ -90,20 +91,6 @@ void Instance(Instance instance); /// <summary> - /// Register a previously built Instance. This provides a "catch all" - /// method to attach custom Instance objects. Synonym for Instance() - /// </summary> - /// <param name="instance"></param> - void IsThis(Instance instance); - - /// <summary> - /// Inject this object directly. Synonym to Object() - /// </summary> - /// <param name="obj"></param> - /// <returns></returns> - LiteralInstance IsThis(T obj); - - /// <summary> /// Inject this object directly. Synonym to IsThis() /// </summary> /// <param name="theObject"></param> @@ -190,7 +177,7 @@ /// <param name="configuration"></param> /// <returns></returns> // Conditional object construction - ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression<T>> configuration); + ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration); } public class InstanceExpression<T> : IInstanceExpression<T>, ThenItExpression<T> @@ -226,7 +213,7 @@ _action(instance); } - private T returnInstance<T>(T instance) where T : Instance + private INSTANCE returnInstance<INSTANCE>(INSTANCE instance) where INSTANCE : Instance { Instance(instance); return instance; @@ -282,7 +269,7 @@ return returnInstance(new UserControlInstance(url)); } - public ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression<T>> configuration) + public ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration) { return returnInstance(new ConditionalInstance<T>(configuration)); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -151,7 +151,7 @@ /// <summary> /// Define the default instance of the PluginType for the containing Profile /// </summary> - /// <param name="mementoBuilder"></param> + /// <param name="instance"></param> /// <returns></returns> public ProfileExpression Use(Instance instance) { Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -43,7 +43,7 @@ /// class. Applies globally to all Containers in a single AppDomain. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="func"></param> + /// <param name="expression"></param> void SelectConstructor<T>(Expression<Func<T>> expression); } @@ -352,7 +352,7 @@ /// class. Applies globally to all Containers in a single AppDomain. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="func"></param> + /// <param name="expression"></param> public void SelectConstructor<T>(Expression<Func<T>> expression) { PluginCache.GetPlugin(typeof(T)).UseConstructor(expression); Modified: trunk/Source/StructureMap/Configuration/GraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.Reflection; using StructureMap.Configuration.DSL; using StructureMap.Graph; @@ -11,8 +10,7 @@ { private readonly AssemblyScanner _assemblyScanner; private readonly PluginGraph _pluginGraph; - private Profile _profile; - private Container _systemContainer; + private readonly Container _systemContainer; private readonly PluginGraph _systemGraph; Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Container.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -506,8 +506,8 @@ /// <param name="templateType"></param> /// <returns></returns> /// <example> - /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) - /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); + /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) + /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); /// </example> public OpenGenericTypeExpression ForGenericType(Type templateType) { Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -48,7 +48,6 @@ try { return base.CreateInstance(pluginType, instance); - _dependencyStack.Pop(); } catch (StructureMapException ex) { @@ -81,9 +80,7 @@ object builtInstance = CreateInstance(pluginType, instance); validate(pluginType, instance, builtInstance); } -#pragma warning disable EmptyGeneralCatchClause catch (Exception) -#pragma warning restore EmptyGeneralCatchClause { // All exceptions are being dealt with in another place } Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -188,10 +188,9 @@ private void scanTypesInAssembly(Assembly assembly, PluginGraph graph) { - Type[] exportedTypes; try { - foreach (Type type in assembly.GetExportedTypes()) + foreach (var type in assembly.GetExportedTypes()) { if (!isInTheIncludes(type)) continue; if (isInTheExcludes(type)) continue; Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/IContainer.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -233,8 +233,8 @@ /// <param name="templateType"></param> /// <returns></returns> /// <example> - /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) - /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); + /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) + /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); /// </example> Container.OpenGenericTypeExpression ForGenericType(Type templateType); Modified: trunk/Source/StructureMap/InitializationExpression.cs =================================================================== --- trunk/Source/StructureMap/InitializationExpression.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/InitializationExpression.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -85,7 +85,6 @@ /// Scoping, the Default Instance, and interception. This method is specifically /// meant for registering open generic types /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> GenericFamilyExpression ForRequestedType(Type pluginType); Modified: trunk/Source/StructureMap/InstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilder.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/InstanceBuilder.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -3,6 +3,7 @@ namespace StructureMap { +#pragma warning disable 169 /// <summary> /// Base class for creating an object instance from an InstanceMemento. SubClasses are /// emitted for each concrete Plugin with constructor parameters. @@ -20,4 +21,5 @@ public virtual void BuildUp(IConfiguredInstance instance, BuildSession session, object target) { } } +#pragma warning restore 169 } \ No newline at end of file Modified: trunk/Source/StructureMap/Model.cs =================================================================== --- trunk/Source/StructureMap/Model.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Model.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -13,7 +13,7 @@ public interface IModel { /// <summary> - /// Access to all the <seealso cref="PluginType">PluginType</seealso> registrations + /// Access to all the <seealso cref="PluginTypeConfiguration">Plugin Type</seealso> registrations /// </summary> IEnumerable<PluginTypeConfiguration> PluginTypes { get; } @@ -27,7 +27,7 @@ bool HasDefaultImplementationFor(Type pluginType); /// <summary> - /// Can StructureMap fulfill a request to ObjectFactory.GetInstance<T>() from the + /// Can StructureMap fulfill a request to ObjectFactory.GetInstance<T>() from the /// current configuration. This does not include concrete classes that could be auto-configured /// upon demand /// </summary> @@ -45,7 +45,6 @@ /// <summary> /// Queryable access to all of the <see cref="IInstance">IInstance</see> for a given PluginType /// </summary> - /// <param name="pluginType"></param> /// <returns></returns> IEnumerable<IInstance> InstancesOf<T>(); Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/ObjectFactory.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -88,7 +88,7 @@ /// to introduce mocks or stubs during automated testing scenarios /// </summary> /// <param name="pluginType"></param> - /// <param name="stub"></param> + /// <param name="instance"></param> public static void Inject(Type pluginType, object instance) { container.Inject(pluginType, instance); @@ -117,7 +117,7 @@ /// pluginType. Mostly used for temporarily setting up return values of the Container /// to introduce mocks or stubs during automated testing scenarios /// </summary> - /// <typeparam name="T"></typeparam> + /// <typeparam name="PLUGINTYPE"></typeparam> /// <param name="name"></param> /// <param name="instance"></param> public static void Inject<PLUGINTYPE>(string name, PLUGINTYPE instance) @@ -162,7 +162,7 @@ /// <summary> /// Creates or finds the default instance of type T /// </summary> - /// <typeparam name="T"></typeparam> + /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> public static PLUGINTYPE GetInstance<PLUGINTYPE>() { @@ -172,18 +172,17 @@ /// <summary> /// Creates a new instance of the requested type using the supplied Instance. Mostly used internally /// </summary> - /// <param name="pluginType"></param> + /// <param name="targetType"></param> /// <param name="instance"></param> /// <returns></returns> - public static object GetInstance(Type TargetType, Instance instance) + public static object GetInstance(Type targetType, Instance instance) { - return container.GetInstance(TargetType, instance); + return container.GetInstance(targetType, instance); } /// <summary> /// Creates a new instance of the requested type T using the supplied Instance. Mostly used internally /// </summary> - /// <param name="pluginType"></param> /// <param name="instance"></param> /// <returns></returns> public static T GetInstance<T>(Instance instance) @@ -195,7 +194,7 @@ /// Creates or finds the named instance of the pluginType /// </summary> /// <param name="pluginType"></param> - /// <param name="instanceKey"></param> + /// <param name="name"></param> /// <returns></returns> public static object GetNamedInstance(Type pluginType, string name) { @@ -205,8 +204,8 @@ /// <summary> /// Creates or finds the named instance of T /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="instanceKey"></param> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <param name="name"></param> /// <returns></returns> public static PLUGINTYPE GetNamedInstance<PLUGINTYPE>(string name) { @@ -227,7 +226,7 @@ /// <summary> /// Creates or resolves all registered instances of type T /// </summary> - /// <typeparam name="T"></typeparam> + /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> public static IList<PLUGINTYPE> GetAllInstances<PLUGINTYPE>() { @@ -290,7 +289,6 @@ /// <summary> /// Sets the default instance for all PluginType's to the designated Profile. /// </summary> - /// <param name="profile"></param> public static string Profile { set @@ -377,7 +375,6 @@ /// </summary> /// <param name="pluginType"></param> /// <param name="instanceKey"></param> - /// <param name="instance"></param> /// <returns></returns> public static object TryGetInstance(Type pluginType, string instanceKey) { @@ -388,7 +385,6 @@ /// Creates or finds the default instance of the pluginType. Returns null if the pluginType is not known to the container. /// </summary> /// <param name="pluginType"></param> - /// <param name="instance"></param> /// <returns></returns> public static object TryGetInstance(Type pluginType) { @@ -399,7 +395,6 @@ /// Creates or finds the default instance of type T. Returns the default value of T if it is not known to the container. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="instance"></param> /// <returns></returns> public static T TryGetInstance<T>() { @@ -410,7 +405,7 @@ /// Creates or finds the named instance of type T. Returns the default value of T if the named instance is not known to the container. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="instance"></param> + /// <param name="instanceKey"></param> /// <returns></returns> public static T TryGetInstance<T>(string instanceKey) { @@ -435,8 +430,8 @@ /// <param name="templateType"></param> /// <returns></returns> /// <example> - /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) - /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); + /// IFlattener flattener1 = container.ForGenericType(typeof (IFlattener<>)) + /// .WithParameters(typeof (Address)).GetInstanceAs<IFlattener>(); /// </example> public static Container.OpenGenericTypeExpression ForGenericType(Type templateType) { Modified: trunk/Source/StructureMap/Pipeline/ConditionalInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConditionalInstance.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Pipeline/ConditionalInstance.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -17,9 +17,9 @@ public Instance _default = new DefaultInstance(); - public ConditionalInstance(Action<ConditionalInstanceExpression<T>> action) + public ConditionalInstance(Action<ConditionalInstanceExpression> action) { - action(new ConditionalInstanceExpression<T>(this)); + action(new ConditionalInstanceExpression(this)); } protected override string getDescription() @@ -40,7 +40,7 @@ return instance.Build(pluginType, session); } - public class ConditionalInstanceExpression<T> + public class ConditionalInstanceExpression { private readonly ConditionalInstance<T> _parent; Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -214,14 +214,14 @@ return _pluggedType; } - protected string findPropertyName<T>() + protected string findPropertyName<PLUGINTYPE>() { var plugin = new Plugin(_pluggedType); string propertyName = plugin.FindArgumentNameForType<T>(); if (string.IsNullOrEmpty(propertyName)) { - throw new StructureMapException(305, typeof (T)); + throw new StructureMapException(305, typeof(PLUGINTYPE)); } return propertyName; Modified: trunk/Source/StructureMap/Pipeline/DefaultInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -4,11 +4,6 @@ { public class DefaultInstance : Instance { - public DefaultInstance() - { - int x = 1; - } - protected override bool doesRecordOnTheStack { get { return false; } Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -133,7 +133,7 @@ { return build(pluginType, session); } - catch (StructureMapException ex) + catch (StructureMapException) { throw; } Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -34,7 +34,6 @@ /// Register an Action to perform on the object created by this Instance /// before it is returned to the caller /// </summary> - /// <typeparam name="T"></typeparam> /// <param name="handler"></param> /// <returns></returns> public SmartInstance<T> OnCreation(Action<T> handler) @@ -49,7 +48,6 @@ /// Register an Action to perform on the object created by this Instance /// before it is returned to the caller /// </summary> - /// <typeparam name="T"></typeparam> /// <param name="handler"></param> /// <returns></returns> public SmartInstance<T> OnCreation(Action<IContext, T> handler) @@ -192,7 +190,7 @@ /// </summary> /// <typeparam name="CTORTYPE"></typeparam> /// <returns></returns> - public DependencyExpression<T, CTORTYPE> CtorDependency<CTORTYPE>() + public DependencyExpression<CTORTYPE> CtorDependency<CTORTYPE>() { string constructorArg = getArgumentNameForType<CTORTYPE>(); return CtorDependency<CTORTYPE>(constructorArg); @@ -211,9 +209,9 @@ /// <typeparam name="CTORTYPE"></typeparam> /// <param name="constructorArg"></param> /// <returns></returns> - public DependencyExpression<T, CTORTYPE> CtorDependency<CTORTYPE>(string constructorArg) + public DependencyExpression<CTORTYPE> CtorDependency<CTORTYPE>(string constructorArg) { - return new DependencyExpression<T, CTORTYPE>(this, constructorArg); + return new DependencyExpression<CTORTYPE>(this, constructorArg); } /// <summary> @@ -222,11 +220,11 @@ /// <typeparam name="SETTERTYPE"></typeparam> /// <param name="expression"></param> /// <returns></returns> - public DependencyExpression<T, SETTERTYPE> SetterDependency<SETTERTYPE>( + public DependencyExpression<SETTERTYPE> SetterDependency<SETTERTYPE>( Expression<Func<T, SETTERTYPE>> expression) { string propertyName = ReflectionHelper.GetProperty(expression).Name; - return new DependencyExpression<T, SETTERTYPE>(this, propertyName); + return new DependencyExpression<SETTERTYPE>(this, propertyName); } /// <summary> @@ -235,7 +233,7 @@ /// </summary> /// <typeparam name="SETTERTYPE"></typeparam> /// <returns></returns> - public DependencyExpression<T, SETTERTYPE> SetterDependency<SETTERTYPE>() + public DependencyExpression<SETTERTYPE> SetterDependency<SETTERTYPE>() { return CtorDependency<SETTERTYPE>(); } @@ -246,7 +244,7 @@ /// </summary> /// <typeparam name="CHILD"></typeparam> /// <returns></returns> - public ArrayDefinitionExpression<T, CHILD> TheArrayOf<CHILD>() + public ArrayDefinitionExpression<CHILD> TheArrayOf<CHILD>() { if (typeof (CHILD).IsArray) { @@ -266,9 +264,9 @@ /// <typeparam name="CHILD"></typeparam> /// <param name="ctorOrPropertyName"></param> /// <returns></returns> - public ArrayDefinitionExpression<T, CHILD> TheArrayOf<CHILD>(string ctorOrPropertyName) + public ArrayDefinitionExpression<CHILD> TheArrayOf<CHILD>(string ctorOrPropertyName) { - return new ArrayDefinitionExpression<T, CHILD>(this, ctorOrPropertyName); + return new ArrayDefinitionExpression<CHILD>(this, ctorOrPropertyName); } #region Nested type: ArrayDefinitionExpression @@ -276,9 +274,8 @@ /// <summary> /// Expression Builder to help define multiple Instances for an Array dependency /// </summary> - /// <typeparam name="T"></typeparam> /// <typeparam name="ARRAY"></typeparam> - public class ArrayDefinitionExpression<T, ARRAY> + public class ArrayDefinitionExpression<ARRAY> { private readonly SmartInstance<T> _instance; private readonly string _propertyName; @@ -298,7 +295,7 @@ { var list = new List<Instance>(); - var child = new InstanceExpression<ARRAY>(i => list.Add(i)); + var child = new InstanceExpression<ARRAY>(list.Add); action(child); _instance.setChildArray(_propertyName, list.ToArray()); @@ -326,9 +323,8 @@ /// <summary> /// Expression Builder that helps to define child dependencies inline /// </summary> - /// <typeparam name="T"></typeparam> /// <typeparam name="CHILD"></typeparam> - public class DependencyExpression<T, CHILD> + public class DependencyExpression<CHILD> { private readonly SmartInstance<T> _instance; private readonly string _propertyName; Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-01-22 22:33:20 UTC (rev 227) @@ -56,13 +56,12 @@ <DebugSymbols>true</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> + <NoWarn>618,1591</NoWarn> <Optimize>false</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> <TreatWarningsAsErrors>false</TreatWarningsAsErrors> - <WarningLevel>0</WarningLevel> + <WarningLevel>4</WarningLevel> <DebugType>full</DebugType> <ErrorReport>prompt</ErrorReport> </PropertyGroup> @@ -78,12 +77,11 @@ <DebugSymbols>true</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> + <NoWarn>618,1591</NoWarn> <Optimize>true</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> - <TreatWarningsAsErrors>false</TreatWarningsAsErrors> + <TreatWarningsAsErrors>true</TreatWarningsAsErrors> <WarningLevel>4</WarningLevel> <DebugType>pdbonly</DebugType> <ErrorReport>prompt</ErrorReport> @@ -100,8 +98,7 @@ <DebugSymbols>true</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> + <NoWarn>618, 1591</NoWarn> <Optimize>false</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> Modified: trunk/Source/StructureMap.AutoMocking/AutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/AutoMocker.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap.AutoMocking/AutoMocker.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -10,8 +10,7 @@ public interface IAutoMocker<TARGETCLASS> where TARGETCLASS : class { /// <summary> - ///Gets an instance of the ClassUnderTest with mock objects (or stubs) pushed in -// for all of its dependencies + ///Gets an instance of the ClassUnderTest with mock objects (or stubs) pushed in for all of its dependencies /// </summary> TARGETCLASS ClassUnderTest { get; } @@ -101,8 +100,7 @@ protected ServiceLocator _serviceLocator; /// <summary> - ///Gets an instance of the ClassUnderTest with mock objects (or stubs) pushed in - // for all of its dependencies + ///Gets an instance of the ClassUnderTest with mock objects (or stubs) pushed in for all of its dependencies /// </summary> public TARGETCLASS ClassUnderTest { Modified: trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj =================================================================== --- trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj 2009-01-22 22:33:20 UTC (rev 227) @@ -42,6 +42,7 @@ <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Debug\StructureMap.AutoMocking.XML</DocumentationFile> + <NoWarn>1591</NoWarn> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> @@ -51,6 +52,8 @@ <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <DocumentationFile>bin\Release\StructureMap.AutoMocking.XML</DocumentationFile> + <NoWarn>1591</NoWarn> + <TreatWarningsAsErrors>true</TreatWarningsAsErrors> </PropertyGroup> <ItemGroup> <Reference Include="System" /> Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -95,10 +95,5 @@ autoMocker.Get<IMockedService>().AssertWasCalled(s => s.Go()); } - public interface IAnotherService - { - - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/ConditionalInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConditionalInstanceTester.cs 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap.Testing/Pipeline/ConditionalInstanceTester.cs 2009-01-22 22:33:20 UTC (rev 227) @@ -14,7 +14,6 @@ private Rule Blue = new ColorRule("blue"); private Rule Default = new ColorRule("black"); - private Rule _rule; private BuildSession _session; private void TheRequestedNameIs(string name) @@ -40,7 +39,6 @@ _session = new BuildSession(); - _rule = null; } [Test] @@ -90,7 +88,7 @@ var container = new Container(x => { x.ForRequestedType<Rule>().TheDefault.IsThis(DEFAULT); - x.InstanceOf<Rule>().Is.Conditional(o => + x.InstanceOf<Rule>().Is.Conditional(o => { o.If(c => false).ThenIt.Is.OfConcreteType<ARule>(); }).WithName("conditional"); Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-01-21 00:53:11 UTC (rev 226) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-01-22 22:33:20 UTC (rev 227) @@ -57,8 +57,7 @@ <DebugSymbols>true</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> + <NoWarn>618</NoWarn> <Optimize>false</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> @@ -80,8 +79,7 @@ <DebugSymbols>false</DebugSymbols> <FileAlignment>4096</FileAlignment> <NoStdLib>false</NoStdLib> - <NoWarn> - </NoWarn> + <NoWarn>618</NoWarn> <Optimize>true</Optimize> <RegisterForComInterop>false</RegisterForComInterop> <RemoveIntegerChecks>false</RemoveIntegerChecks> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-02-01 18:35:45
|
Revision: 230 http://structuremap.svn.sourceforge.net/structuremap/?rev=230&view=rev Author: jeremydmiller Date: 2009-02-01 18:34:03 +0000 (Sun, 01 Feb 2009) Log Message: ----------- applying patches, and fixing HttpSession outside of HttpContext Modified Paths: -------------- trunk/Source/StructureMap/Attributes/InstanceScope.cs trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs trunk/Source/StructureMap/Pipeline/SessionWrapper.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs trunk/Source/StructureMap.Testing/Bugs/HttpSessionNullRefBug.cs trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs Property Changed: ---------------- trunk/Source/StructureMap/ Property changes on: trunk/Source/StructureMap ___________________________________________________________________ Modified: svn:ignore - bin obj *.suo *.csproj.user StructureMap.xml + bin obj *.suo *.csproj.user StructureMap.xml [Bb]in [Dd]ebug [Rr]elease *.user *.aps *.eto Modified: trunk/Source/StructureMap/Attributes/InstanceScope.cs =================================================================== --- trunk/Source/StructureMap/Attributes/InstanceScope.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/Attributes/InstanceScope.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -7,6 +7,7 @@ ThreadLocal, HttpContext, Hybrid, - HttpSession + HttpSession, + HybridHttpSession } } \ No newline at end of file Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/BuildSession.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -73,7 +73,7 @@ { private readonly BuildStack _buildStack = new BuildStack(); private readonly InstanceCache _cache = new InstanceCache(); - private readonly Cache<Type, object> _defaults; + private readonly Cache<Type, Func<object>> _defaults; private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; @@ -82,7 +82,7 @@ _pipelineGraph = pipelineGraph; _interceptorLibrary = interceptorLibrary; - _defaults = new Cache<Type, object>(t => + _defaults = new Cache<Type, Func<object>>(t => { Instance instance = _pipelineGraph.GetDefault(t); @@ -91,7 +91,9 @@ throw new StructureMapException(202, t); } - return CreateInstance(t, instance); + object createdInstance = CreateInstance(t, instance); + + return () => createdInstance; }); } @@ -197,7 +199,7 @@ public virtual object CreateInstance(Type pluginType) { - return _defaults[pluginType]; + return _defaults[pluginType](); } public virtual object ApplyInterception(Type pluginType, object actualValue) @@ -208,14 +210,19 @@ public virtual void RegisterDefault(Type pluginType, object defaultObject) { - _defaults[pluginType] = defaultObject; + RegisterDefault(pluginType, () => defaultObject); } + public virtual void RegisterDefault(Type pluginType, Func<object> creator) + { + _defaults[pluginType] = creator; + } + public T TryGetInstance<T>() where T : class { if (_defaults.Has(typeof(T))) { - return (T) _defaults[typeof (T)]; + return (T) _defaults[typeof (T)](); } return _pipelineGraph.HasDefaultForPluginType(typeof (T)) @@ -234,4 +241,4 @@ return _pipelineGraph.ForType(pluginType); } } -} \ No newline at end of file +} Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -301,5 +301,10 @@ family.DefaultInstanceKey = instance.Name; }); } + + public CreatePluginFamilyExpression<PLUGINTYPE> AlwaysUnique() + { + return InterceptConstructionWith(new UniquePerRequestInterceptor()); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -79,8 +79,12 @@ break; case InstanceScope.HttpSession: - AddInterceptor(new HttpSessionBuildPolicy()); + AddInterceptor(new HybridSessionBuildPolicy()); break; + + case InstanceScope.HybridHttpSession: + AddInterceptor(new HybridSessionBuildPolicy()); + break; } } Modified: trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -1,7 +1,5 @@ -using System; using System.Collections; using System.Web; -using System.Web.SessionState; using StructureMap.Attributes; namespace StructureMap.Pipeline @@ -10,6 +8,7 @@ { public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; + public static bool HasContext() { return HttpContext.Current != null; @@ -56,107 +55,4 @@ return InstanceScope.HttpContext.ToString(); } } - - public class HttpSessionBuildPolicy : HttpContextBuildPolicy - { - protected override IDictionary findHttpDictionary() - { - return new SessionWrapper(HttpContext.Current.Session); - } - - public override string ToString() - { - return InstanceScope.HttpSession.ToString(); - } - } - - public class SessionWrapper : IDictionary - { - private readonly HttpSessionState _session; - - public SessionWrapper(HttpSessionState session) - { - _session = session; - } - - #region IDictionary Members - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void CopyTo(Array array, int index) - { - _session.CopyTo(array, index); - } - - public int Count - { - get { return _session.Count; } - } - - public object SyncRoot - { - get { return _session.SyncRoot; } - } - - public bool IsSynchronized - { - get { return _session.IsSynchronized; } - } - - public bool Contains(object key) - { - return _session[key.ToString()] != null; - } - - public void Add(object key, object value) - { - _session.Add(key.ToString(), value); - } - - public void Clear() - { - _session.Clear(); - } - - public IDictionaryEnumerator GetEnumerator() - { - throw new NotImplementedException(); - } - - public void Remove(object key) - { - _session.Remove(key.ToString()); - } - - public object this[object key] - { - get { return _session[key.ToString()]; } - set { _session[key.ToString()] = value; } - } - - public ICollection Keys - { - get { return _session.Keys; } - } - - public ICollection Values - { - get { throw new NotImplementedException(); } - } - - public bool IsReadOnly - { - get { return _session.IsReadOnly; } - } - - public bool IsFixedSize - { - get { return false; } - } - - #endregion - } } Added: trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -0,0 +1,32 @@ +using System.Collections; +using System.Web; +using StructureMap.Attributes; + +namespace StructureMap.Pipeline +{ + public class HttpSessionBuildPolicy : HttpContextBuildPolicy + { + protected override IDictionary findHttpDictionary() + { + return new SessionWrapper(HttpContext.Current.Session); + } + + public override string ToString() + { + return InstanceScope.HttpSession.ToString(); + } + } + + public class HybridSessionBuildPolicy : HttpBuildPolicyBase<HttpSessionBuildPolicy, ThreadLocalStoragePolicy> + { + public override IBuildPolicy Clone() + { + return new HybridSessionBuildPolicy() { InnerPolicy = InnerPolicy.Clone() }; + } + + public override string ToString() + { + return InstanceScope.HybridHttpSession.ToString(); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/SessionWrapper.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SessionWrapper.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/SessionWrapper.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.Web.SessionState; + +namespace StructureMap.Pipeline +{ + public class SessionWrapper : IDictionary + { + private readonly HttpSessionState _session; + + public SessionWrapper(HttpSessionState session) + { + _session = session; + } + + #region IDictionary Members + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void CopyTo(Array array, int index) + { + _session.CopyTo(array, index); + } + + public int Count + { + get { return _session.Count; } + } + + public object SyncRoot + { + get { return _session.SyncRoot; } + } + + public bool IsSynchronized + { + get { return _session.IsSynchronized; } + } + + public bool Contains(object key) + { + return _session[key.ToString()] != null; + } + + public void Add(object key, object value) + { + _session.Add(key.ToString(), value); + } + + public void Clear() + { + _session.Clear(); + } + + public IDictionaryEnumerator GetEnumerator() + { + throw new NotImplementedException(); + } + + public void Remove(object key) + { + _session.Remove(key.ToString()); + } + + public object this[object key] + { + get { return _session[key.ToString()]; } + set { _session[key.ToString()] = value; } + } + + public ICollection Keys + { + get { return _session.Keys; } + } + + public ICollection Values + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { return _session.IsReadOnly; } + } + + public bool IsFixedSize + { + get { return false; } + } + + #endregion + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -0,0 +1,46 @@ +using System; + +namespace StructureMap.Pipeline +{ + /// <summary> + /// Makes sure that every request for this object returns a unique object + /// </summary> + public class UniquePerRequestInterceptor : IBuildInterceptor + { + + #region IBuildInterceptor Members + + private IBuildPolicy _innerPolicy = new BuildPolicy(); + + public IBuildPolicy InnerPolicy + { + get { return _innerPolicy; } + set { _innerPolicy = value; } + } + + #endregion + + #region IBuildPolicy Members + + public object Build(BuildSession buildSession, Type pluginType, Instance instance) + { + //insert a default object creator + buildSession.RegisterDefault(pluginType, () => InnerPolicy.Build(buildSession, pluginType, instance)); + + //build this object for the first time + return buildSession.CreateInstance(pluginType); + } + + public IBuildPolicy Clone() + { + return new UniquePerRequestInterceptor(); + } + + public void EjectAll() + { + InnerPolicy.EjectAll(); + } + + #endregion + } +} Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-02-01 18:34:03 UTC (rev 230) @@ -405,6 +405,9 @@ <Compile Include="Graph\PluggableAttributeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> + <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> + <Compile Include="Pipeline\SessionWrapper.cs" /> + <Compile Include="Pipeline\UniquePerRequestInterceptor.cs" /> <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap/Util/Cache.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -79,7 +79,9 @@ if (!_values.ContainsKey(key)) { VALUE value = _onMissing(key); - _values.Add(key, value); + //Check to make sure that the onMissing didn't cache this already + if(!_values.ContainsKey(key)) + _values.Add(key, value); } } } @@ -203,4 +205,4 @@ _values.Clear(); } } -} \ No newline at end of file +} Added: trunk/Source/StructureMap.Testing/Bugs/HttpSessionNullRefBug.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/HttpSessionNullRefBug.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/HttpSessionNullRefBug.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -0,0 +1,25 @@ +using NUnit.Framework; +using StructureMap.Attributes; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class HttpSessionNullRefBug + { + [Test] + public void SetUp() + { + var container = new Container(x => + { + x.ForRequestedType<IGateway>() + .CacheBy(InstanceScope.HybridHttpSession) + .TheDefaultIsConcreteType<DefaultGateway>(); + }); + + container.GetInstance<IGateway>().ShouldNotBeNull(); + } + + + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -265,10 +265,19 @@ var family = new PluginFamily(typeof(IServiceProvider)); family.SetScopeTo(InstanceScope.HttpSession); - family.Policy.ShouldBeOfType<HttpSessionBuildPolicy>(); + family.Policy.ShouldBeOfType<HybridSessionBuildPolicy>(); } [Test] + public void set_the_scope_to_session_hybrid() + { + var family = new PluginFamily(typeof(IServiceProvider)); + family.SetScopeTo(InstanceScope.HybridHttpSession); + + family.Policy.ShouldBeOfType<HybridSessionBuildPolicy>(); + } + + [Test] public void SetScopeToSingleton() { var family = new PluginFamily(typeof (IServiceProvider)); Added: trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs 2009-02-01 18:34:03 UTC (rev 230) @@ -0,0 +1,70 @@ +using NUnit.Framework; +using StructureMap.Pipeline; + +namespace StructureMap.Testing +{ + [TestFixture] + public class PerRequestInterceptorTester + { + //Think of this as a data session + public class Session + { + } + + public class Model1 + { + public Model1(Session session) + { + Session = session; + } + + public Session Session { get; set; } + } + + public class Model2 + { + public Model2(Session session) + { + Session = session; + } + + public Session Session { get; set; } + } + + //this is my shell, it needs some models + public class Shell + { + public Shell(Model1 model1, Model2 model2) + { + Model1 = model1; + Model2 = model2; + } + + public Model1 Model1 { get; set; } + public Model2 Model2 { get; set; } + } + + [Test] + public void TestObjectReturnedAreUnique() + { + ObjectFactory.Initialize( + x => + { + x.BuildInstancesOf<Session>() + .AlwaysUnique() + .TheDefaultIsConcreteType<Session>(); + x.BuildInstancesOf<Model1>() + .TheDefaultIsConcreteType<Model1>(); + x.BuildInstancesOf<Model2>() + .TheDefaultIsConcreteType<Model2>(); + x.BuildInstancesOf<Shell>() + .TheDefaultIsConcreteType<Shell>(); + }); + + var shell = ObjectFactory.GetInstance<Shell>(); + + shell.Model1.Session.ShouldNotBeTheSameAs(shell.Model2.Session); + + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-02-01 17:47:12 UTC (rev 229) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-02-01 18:34:03 UTC (rev 230) @@ -178,6 +178,7 @@ <Compile Include="AutoMocking\RhinoMockRepositoryProxyTester.cs" /> <Compile Include="AutoWiringExamples.cs" /> <Compile Include="Bugs\BuildUpBug.cs" /> + <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> <Compile Include="Bugs\ScanIndexerBugTester.cs" /> <Compile Include="Bugs\SingletonShouldBeLazy.cs" /> @@ -373,6 +374,7 @@ <Compile Include="TestData\DataMother.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="PerRequestInterceptorTester.cs" /> <Compile Include="TestUtility.cs" /> <Compile Include="Diagnostics\ValidationBuildSessionTester.cs" /> <Compile Include="TypeExtensionsTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-04-19 18:40:59
|
Revision: 235 http://structuremap.svn.sourceforge.net/structuremap/?rev=235&view=rev Author: jeremydmiller Date: 2009-04-19 18:40:49 +0000 (Sun, 19 Apr 2009) Log Message: ----------- Making StructureMap throw a clean error when a cyclic dependency is detected Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/CloseGenericTypeExpression.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceCache.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/BuildFrame.cs trunk/Source/StructureMap/Pipeline/BuildStack.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs trunk/Source/StructureMap.Testing/Pipeline/GenericsHelperExpressionTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/IContext.cs trunk/Source/StructureMap.Testing/BidirectionalDependencies.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/BuildSession.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -1,5 +1,4 @@ using System; -using System.Collections; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; @@ -7,68 +6,6 @@ namespace StructureMap { - public interface IContext - { - /// <summary> - /// Gets a reference to the <see cref="BuildStack">BuildStack</see> for this build session - /// </summary> - BuildStack BuildStack { get; } - - /// <summary> - /// The concrete type of the immediate parent object in the object graph - /// </summary> - Type ParentType { get; } - - /// <summary> - /// Get the object of type T that is valid for this build session. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - T GetInstance<T>(); - - /// <summary> - /// Get the object of type T that is valid for this build session by name. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - T GetInstance<T>(string name); - - /// <summary> - /// Gets the root "frame" of the object request - /// </summary> - BuildFrame Root { get; } - - /// <summary> - /// The requested instance name of the object graph - /// </summary> - string RequestedName { get; } - - /// <summary> - /// Register a default object for the given PluginType that will - /// be used throughout the rest of the current object request - /// </summary> - /// <param name="pluginType"></param> - /// <param name="defaultObject"></param> - void RegisterDefault(Type pluginType, object defaultObject); - - /// <summary> - /// Same as GetInstance, but can gracefully return null if - /// the Type does not already exist - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - T TryGetInstance<T>() where T : class; - - /// <summary> - /// Same as GetInstance(name), but can gracefully return null if - /// the Type and name does not already exist - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="name"></param> - /// <returns></returns> - T TryGetInstance<T>(string name) where T : class; - } - public class BuildSession : IContext { private readonly BuildStack _buildStack = new BuildStack(); @@ -102,13 +39,12 @@ { } - public BuildSession() : this(new PluginGraph()) + public BuildSession() + : this(new PluginGraph()) { } - public string RequestedName { get; set; } - protected PipelineGraph pipelineGraph { get { return _pipelineGraph; } @@ -116,6 +52,12 @@ #region IContext Members + public string RequestedName + { + get; + set; + } + public BuildStack BuildStack { get { return _buildStack; } @@ -145,6 +87,28 @@ get { return _buildStack.Root; } } + public virtual void RegisterDefault(Type pluginType, object defaultObject) + { + RegisterDefault(pluginType, () => defaultObject); + } + + public T TryGetInstance<T>() where T : class + { + if (_defaults.Has(typeof (T))) + { + return (T) _defaults[typeof (T)](); + } + + return _pipelineGraph.HasDefaultForPluginType(typeof (T)) + ? ((IContext) this).GetInstance<T>() + : null; + } + + public T TryGetInstance<T>(string name) where T : class + { + return _pipelineGraph.HasInstance(typeof (T), name) ? ((IContext) this).GetInstance<T>(name) : null; + } + #endregion public virtual object CreateInstance(Type pluginType, string name) @@ -158,6 +122,7 @@ return CreateInstance(pluginType, instance); } + // This is where all Creation happens public virtual object CreateInstance(Type pluginType, Instance instance) { object result = _cache.Get(pluginType, instance); @@ -175,27 +140,17 @@ public virtual Array CreateInstanceArray(Type pluginType, Instance[] instances) { - Array array; - if (instances == null) { - IList list = forType(pluginType).GetAllInstances(this); - array = Array.CreateInstance(pluginType, list.Count); - for (int i = 0; i < list.Count; i++) - { - array.SetValue(list[i], i); - } + instances = forType(pluginType).AllInstances; } - else - { - array = Array.CreateInstance(pluginType, instances.Length); - for (int i = 0; i < instances.Length; i++) - { - Instance instance = instances[i]; - object arrayValue = forType(pluginType).Build(this, instance); - array.SetValue(arrayValue, i); - } + Array array = Array.CreateInstance(pluginType, instances.Length); + for (int i = 0; i < instances.Length; i++) + { + Instance instance = instances[i]; + object arrayValue = CreateInstance(pluginType, instance); + array.SetValue(arrayValue, i); } return array; @@ -212,37 +167,15 @@ return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue, this); } - public virtual void RegisterDefault(Type pluginType, object defaultObject) - { - RegisterDefault(pluginType, () => defaultObject); - } - public virtual void RegisterDefault(Type pluginType, Func<object> creator) { _defaults[pluginType] = creator; } - public T TryGetInstance<T>() where T : class - { - if (_defaults.Has(typeof(T))) - { - return (T) _defaults[typeof (T)](); - } - return _pipelineGraph.HasDefaultForPluginType(typeof (T)) - ? ((IContext) this).GetInstance<T>() - : null; - } - - public T TryGetInstance<T>(string name) where T : class - { - return _pipelineGraph.HasInstance(typeof (T), name) ? ((IContext) this).GetInstance<T>(name) : null; - } - - private IInstanceFactory forType(Type pluginType) { return _pipelineGraph.ForType(pluginType); } } -} +} \ No newline at end of file Modified: trunk/Source/StructureMap/CloseGenericTypeExpression.cs =================================================================== --- trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; namespace StructureMap { @@ -7,8 +9,13 @@ T As<T>(); } - public class CloseGenericTypeExpression : OpenGenericTypeSpecificationExpression + public interface OpenGenericTypeListSpecificationExpression { + IList<T> As<T>(); + } + + public class CloseGenericTypeExpression : OpenGenericTypeSpecificationExpression, OpenGenericTypeListSpecificationExpression + { private readonly object _subject; private readonly IContainer _container; private Type _pluginType; @@ -26,13 +33,18 @@ /// <returns></returns> public OpenGenericTypeSpecificationExpression GetClosedTypeOf(Type type) { + closeType(type); + return this; + } + + private void closeType(Type type) + { if (!type.IsGeneric()) { throw new StructureMapException(285); } _pluginType = type.MakeGenericType(_subject.GetType()); - return this; } /// <summary> @@ -44,5 +56,23 @@ { return (T) _container.With(_subject.GetType(), _subject).GetInstance(_pluginType); } + + public OpenGenericTypeListSpecificationExpression GetAllClosedTypesOf(Type type) + { + closeType(type); + return this; + } + + IList<T> OpenGenericTypeListSpecificationExpression.As<T>() + { + IList list = _container.With(_subject.GetType(), _subject).GetAllInstances(_pluginType); + var returnValue = new List<T>(); + foreach (var o in list) + { + returnValue.Add((T) o); + } + + return returnValue; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/Container.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -11,7 +11,6 @@ namespace StructureMap { - public class Container : TypeRules, IContainer { private InterceptorLibrary _interceptorLibrary; @@ -147,7 +146,8 @@ args.RegisterDefaults(session); - return forType(type).GetAllInstances(session); + var instances = session.CreateInstanceArray(type, null); + return new ArrayList(instances); } @@ -365,7 +365,8 @@ /// <returns></returns> public IList GetAllInstances(Type pluginType) { - return forType(pluginType).GetAllInstances(withNewSession(Plugin.DEFAULT)); + var instances = withNewSession(Plugin.DEFAULT).CreateInstanceArray(pluginType, null); + return new ArrayList(instances); } /// <summary> @@ -482,7 +483,7 @@ private IList<T> getListOfTypeWithSession<T>(BuildSession session) { var list = new List<T>(); - foreach (T instance in forType(typeof (T)).GetAllInstances(session)) + foreach (T instance in session.CreateInstanceArray(typeof(T), null)) { list.Add(instance); } @@ -505,12 +506,6 @@ return new BuildSession(_pipelineGraph, _interceptorLibrary){RequestedName = name}; } - - protected IInstanceFactory forType(Type type) - { - return _pipelineGraph.ForType(type); - } - /// <summary> /// Convenience method to request an object using an Open Generic /// Type and its parameter Types Added: trunk/Source/StructureMap/IContext.cs =================================================================== --- trunk/Source/StructureMap/IContext.cs (rev 0) +++ trunk/Source/StructureMap/IContext.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -0,0 +1,67 @@ +using System; +using StructureMap.Pipeline; + +namespace StructureMap +{ + public interface IContext + { + /// <summary> + /// Gets a reference to the <see cref="BuildStack">BuildStack</see> for this build session + /// </summary> + BuildStack BuildStack { get; } + + /// <summary> + /// The concrete type of the immediate parent object in the object graph + /// </summary> + Type ParentType { get; } + + /// <summary> + /// Get the object of type T that is valid for this build session. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + T GetInstance<T>(); + + /// <summary> + /// Get the object of type T that is valid for this build session by name. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + T GetInstance<T>(string name); + + /// <summary> + /// Gets the root "frame" of the object request + /// </summary> + BuildFrame Root { get; } + + /// <summary> + /// The requested instance name of the object graph + /// </summary> + string RequestedName { get; } + + /// <summary> + /// Register a default object for the given PluginType that will + /// be used throughout the rest of the current object request + /// </summary> + /// <param name="pluginType"></param> + /// <param name="defaultObject"></param> + void RegisterDefault(Type pluginType, object defaultObject); + + /// <summary> + /// Same as GetInstance, but can gracefully return null if + /// the Type does not already exist + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + T TryGetInstance<T>() where T : class; + + /// <summary> + /// Same as GetInstance(name), but can gracefully return null if + /// the Type and name does not already exist + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="name"></param> + /// <returns></returns> + T TryGetInstance<T>(string name) where T : class; + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -16,15 +16,23 @@ IBuildPolicy Policy { get; } Instance MissingInstance { get; set; } + Instance[] AllInstances + { + get; + } + void AddInstance(Instance instance); Instance AddType<T>(); + [Obsolete("Return the list of Instances instead")] IList GetAllInstances(BuildSession session); + object Build(BuildSession session, Instance instance); Instance FindInstance(string name); - void ForEachInstance(Action<Instance> action); void ImportFrom(PluginFamily family); void EjectAllInstances(); + + } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceCache.cs =================================================================== --- trunk/Source/StructureMap/InstanceCache.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/InstanceCache.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -39,6 +39,14 @@ public void Set(Type pluginType, Instance Instance, object result) { Dictionary<Instance, object> cache = getCache(pluginType); + + if (cache.ContainsKey(Instance)) + { + string message = string.Format("Duplicate Objects detected for Instance {0} of Type {1}", Instance.Name, + pluginType.AssemblyQualifiedName); + throw new ApplicationException(message); + + } cache.Add(Instance, result); } } Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -87,16 +87,20 @@ get { return _instances.GetAll(); } } + public Instance[] AllInstances + { + get + { + return _instances.GetAll(); + } + } + public IBuildPolicy Policy { get { return _policy; } set { _policy = value; } } - public void ForEachInstance(Action<Instance> action) - { - _instances.Each(action); - } public void AddInstance(Instance instance) { Modified: trunk/Source/StructureMap/Pipeline/BuildFrame.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildFrame.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/Pipeline/BuildFrame.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -115,5 +115,30 @@ return result; } } + + public bool Contains(BuildFrame frame) + { + if (_requestedType == frame._requestedType && _name == frame._name) + { + return true; + } + + return _next == null ? false : _next.Contains(frame); + } + + public string ToStackString() + { + string message = "\n1.) " + ToString(); + var next = _next; + + int i = 2; + while (next != null) + { + message += "\n{0}.) {1}".ToFormat(i++, next); + next = next._next; + } + + return message; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/BuildStack.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildStack.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/Pipeline/BuildStack.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -1,3 +1,5 @@ +using System; + namespace StructureMap.Pipeline { /// <summary> @@ -45,6 +47,13 @@ } else { + if (_root.Contains(frame)) + { + + + throw new StructureMapException(295, frame.ToString(), _root.ToStackString()); + } + _current.Attach(frame); _current = frame; } Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Interceptors; @@ -124,7 +125,8 @@ { if (!doesRecordOnTheStack) return; - session.BuildStack.Push(new BuildFrame(pluginType, Name, getConcreteType(pluginType))); + var frame = new BuildFrame(pluginType, Name, getConcreteType(pluginType)); + session.BuildStack.Push(frame); } private object createRawObject(Type pluginType, BuildSession session) Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 18:40:49 UTC (rev 235) @@ -405,6 +405,7 @@ <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluggableAttributeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> + <Compile Include="IContext.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> <Compile Include="Pipeline\SessionWrapper.cs" /> Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/StructureMapException.resx 2009-04-19 18:40:49 UTC (rev 235) @@ -271,4 +271,7 @@ <data name="290" xml:space="preserve"> <value>Could not load the designated Registry class '{0}'</value> </data> + <data name="295" xml:space="preserve"> + <value>Bidirectional Dependency Problem detected with {0}. The BuildStack is: {1}</value> + </data> </root> \ No newline at end of file Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -72,6 +72,16 @@ return pluggedType.BaseType == typeof(object) ? null : pluggedType.BaseType.FindInterfaceThatCloses(templateType); } + public static bool IsNullable(this Type type) + { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>); + } + + public static Type GetInnerTypeFromNullable(this Type nullableType) + { + return nullableType.GetGenericArguments()[0]; + } + public static string GetName(this Type type) { if (type.IsGenericType) Added: trunk/Source/StructureMap.Testing/BidirectionalDependencies.cs =================================================================== --- trunk/Source/StructureMap.Testing/BidirectionalDependencies.cs (rev 0) +++ trunk/Source/StructureMap.Testing/BidirectionalDependencies.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -0,0 +1,68 @@ +using System; +using System.Diagnostics; +using NUnit.Framework; + +namespace StructureMap.Testing +{ + [TestFixture] public class BidirectionalDependencies + { + private Container container; + + [SetUp] public void SetUp() + { + container = new Container(x => + { + x.ForRequestedType<IBiView>().TheDefaultIsConcreteType<BiView>(); + x.ForRequestedType<IBiPresenter>().TheDefaultIsConcreteType<BiPresenter>(); + }); + } + + [Test] public void do_not_blow_up_with_a_stack_overflow_problem() + { + try + { + container.GetInstance<BiView>(); + Assert.Fail("Should have thrown error"); + } + catch (StructureMapException e) + { + Debug.WriteLine(e.ToString()); + e.ErrorCode.ShouldEqual(295); + } + } + } + + + public interface IBiView{} + public interface IBiPresenter{} + + public class BiView : IBiView + { + private readonly IBiPresenter _presenter; + + public BiView(IBiPresenter presenter) + { + _presenter = presenter; + } + + public IBiPresenter Presenter + { + get { return _presenter; } + } + } + + public class BiPresenter : IBiPresenter + { + private readonly IBiView _view; + + public BiPresenter(IBiView view) + { + _view = view; + } + + public IBiView View + { + get { return _view; } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -43,4 +43,26 @@ stack.Current.ShouldBeTheSameAs(root); } } + + [TestFixture] public class when_using_build_frame_contains + { + [SetUp] public void SetUp() + { + + } + + [Test] public void true_if_matching() + { + var frame1 = new BuildFrame(typeof (IWidget), "red", typeof (ColorWidget)); + var frame2 = new BuildFrame(typeof (IWidget), "red", typeof (ColorWidget)); + var frame3 = new BuildFrame(typeof (IWidget), "green", typeof (ColorWidget)); + + frame1.Contains(frame2).ShouldBeTrue(); + frame1.Contains(frame3).ShouldBeFalse(); + + frame3.Attach(frame2); + + frame3.Contains(frame1).ShouldBeTrue(); + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/GenericsHelperExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/GenericsHelperExpressionTester.cs 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap.Testing/Pipeline/GenericsHelperExpressionTester.cs 2009-04-19 18:40:49 UTC (rev 235) @@ -1,3 +1,4 @@ +using System.Collections.Generic; using NUnit.Framework; namespace StructureMap.Testing.Pipeline @@ -182,6 +183,30 @@ } } + [TestFixture] + public class when_getting_all_closed_type_from_an_open_generic_type_by_providing_an_input_parameter + { + [Test] + public void fetch_the_objects() + { + var container = new Container(x => + { + x.ForRequestedType<IHandler<Shipment>>().TheDefaultIsConcreteType<ShipmentHandler>(); + x.ForRequestedType<IHandler<Shipment>>().AddConcreteType<ShipmentHandler2>(); + }); + + var shipment = new Shipment(); + + IList<IHandler> handlers = container + .ForObject(shipment) + .GetAllClosedTypesOf(typeof(IHandler<>)) + .As<IHandler>(); + + handlers[0].ShouldBeOfType<ShipmentHandler>(); + handlers[1].ShouldBeOfType<ShipmentHandler2>(); + } + } + public class Shipment { @@ -211,4 +236,19 @@ get { return _shipment; } } } + + public class ShipmentHandler2 : IHandler<Shipment> + { + private readonly Shipment _shipment; + + public ShipmentHandler2(Shipment shipment) + { + _shipment = shipment; + } + + public Shipment Shipment + { + get { return _shipment; } + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-02-24 03:18:29 UTC (rev 234) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 18:40:49 UTC (rev 235) @@ -177,6 +177,7 @@ <Compile Include="AutoMocking\RhinoAutoMockerTester.cs" /> <Compile Include="AutoMocking\RhinoMockRepositoryProxyTester.cs" /> <Compile Include="AutoWiringExamples.cs" /> + <Compile Include="BidirectionalDependencies.cs" /> <Compile Include="Bugs\BuildUpBug.cs" /> <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-04-19 19:17:21
|
Revision: 236 http://structuremap.svn.sourceforge.net/structuremap/?rev=236&view=rev Author: jeremydmiller Date: 2009-04-19 19:17:16 +0000 (Sun, 19 Apr 2009) Log Message: ----------- Trying to fix a 400 bug related to a lambda returning null Modified Paths: -------------- trunk/Source/StructureMap/Graph/PluginCache.cs trunk/Source/StructureMap/InstanceCache.cs trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/LambdaCreatesNullBugTester.cs Modified: trunk/Source/StructureMap/Graph/PluginCache.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCache.cs 2009-04-19 18:40:49 UTC (rev 235) +++ trunk/Source/StructureMap/Graph/PluginCache.cs 2009-04-19 19:17:16 UTC (rev 236) @@ -30,8 +30,15 @@ _builders = new Cache<Type, InstanceBuilder>(t => { - Plugin plugin = _plugins[t]; - return new InstanceBuilderAssembly(new[] {plugin}).Compile()[0]; + try + { + Plugin plugin = _plugins[t]; + return new InstanceBuilderAssembly(new[] {plugin}).Compile()[0]; + } + catch (Exception e) + { + throw new StructureMapException(245, t.AssemblyQualifiedName, e); + } }); } Modified: trunk/Source/StructureMap/InstanceCache.cs =================================================================== --- trunk/Source/StructureMap/InstanceCache.cs 2009-04-19 18:40:49 UTC (rev 235) +++ trunk/Source/StructureMap/InstanceCache.cs 2009-04-19 19:17:16 UTC (rev 236) @@ -38,6 +38,8 @@ public void Set(Type pluginType, Instance Instance, object result) { + if (result == null) return; + Dictionary<Instance, object> cache = getCache(pluginType); if (cache.ContainsKey(Instance)) Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2009-04-19 18:40:49 UTC (rev 235) +++ trunk/Source/StructureMap/StructureMapException.resx 2009-04-19 19:17:16 UTC (rev 236) @@ -274,4 +274,7 @@ <data name="295" xml:space="preserve"> <value>Bidirectional Dependency Problem detected with {0}. The BuildStack is: {1}</value> </data> + <data name="245" xml:space="preserve"> + <value>Error while trying to create an InstanceBuilder for {0}</value> + </data> </root> \ No newline at end of file Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 18:40:49 UTC (rev 235) +++ trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 19:17:16 UTC (rev 236) @@ -81,7 +81,9 @@ VALUE value = _onMissing(key); //Check to make sure that the onMissing didn't cache this already if(!_values.ContainsKey(key)) + { _values.Add(key, value); + } } } } @@ -90,14 +92,17 @@ } set { - if (_values.ContainsKey(key)) + lock (_locker) { - _values[key] = value; + if (_values.ContainsKey(key)) + { + _values[key] = value; + } + else + { + _values.Add(key, value); + } } - else - { - _values.Add(key, value); - } } } Added: trunk/Source/StructureMap.Testing/Bugs/LambdaCreatesNullBugTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/LambdaCreatesNullBugTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/LambdaCreatesNullBugTester.cs 2009-04-19 19:17:16 UTC (rev 236) @@ -0,0 +1,43 @@ +using System.Security.Principal; +using NUnit.Framework; + +namespace StructureMap.Testing.Bugs +{ + + [TestFixture] public class LambdaCreatesNullBugTester + { + [SetUp] public void SetUp() + { + + } + + [Test] + public void Returning_null_values_in_contructed_by_generates_a_duplicate_cache_entry() + { + var container = new Container(x => + { + x.ForRequestedType<IPrincipal>().TheDefault.Is.ConstructedBy(() => null); + + x.ForRequestedType<TestClass>().TheDefaultIsConcreteType<TestClass>(); + }); + + container.GetInstance<TestClass>().ShouldNotBeNull(); + + + //this throws a duplicate cache entry exception + container.AssertConfigurationIsValid(); + } + } + + + public class TestClass + { + private IPrincipal principal; + + public TestClass(IPrincipal principal) + { + this.principal = principal; + } + + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 18:40:49 UTC (rev 235) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 19:17:16 UTC (rev 236) @@ -181,6 +181,7 @@ <Compile Include="Bugs\BuildUpBug.cs" /> <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> + <Compile Include="Bugs\LambdaCreatesNullBugTester.cs" /> <Compile Include="Bugs\ScanIndexerBugTester.cs" /> <Compile Include="Bugs\SingletonShouldBeLazy.cs" /> <Compile Include="Bugs\SpecifyScopeInConfigureTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-04-19 20:45:14
|
Revision: 237 http://structuremap.svn.sourceforge.net/structuremap/?rev=237&view=rev Author: jeremydmiller Date: 2009-04-19 20:45:09 +0000 (Sun, 19 Apr 2009) Log Message: ----------- Fixing missing instance, PhatBoyG's patch Modified Paths: -------------- trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/MixedConfigureAndInitializeMissingInstanceProblem.cs Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 19:17:16 UTC (rev 236) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 20:45:09 UTC (rev 237) @@ -20,7 +20,6 @@ private IBuildPolicy _buildPolicy = new BuildPolicy(); private string _defaultKey = string.Empty; private PluginGraph _parent; - private IBuildPolicy _policy; public PluginFamily(Type pluginType) : this(pluginType, new PluginGraph()) @@ -260,6 +259,11 @@ { source.EachInstance(instance => _instances.Fill(instance.Name, instance)); source._pluggedTypes.Each((key, plugin) => _pluggedTypes.Fill(key, plugin)); + + if (source.MissingInstance != null) + { + MissingInstance = source.MissingInstance; + } } public Instance FirstInstance() @@ -340,7 +344,7 @@ public IBuildPolicy Policy { get { return _buildPolicy; } - set { _policy = value; } + set { _buildPolicy = value; } } public int PluginCount Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 19:17:16 UTC (rev 236) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 20:45:09 UTC (rev 237) @@ -151,6 +151,11 @@ } family.EachInstance(instance => _instances.Fill(instance.Name, instance)); + + if (family.MissingInstance != null) + { + MissingInstance = family.MissingInstance; + } } public void EjectAllInstances() Added: trunk/Source/StructureMap.Testing/Bugs/MixedConfigureAndInitializeMissingInstanceProblem.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/MixedConfigureAndInitializeMissingInstanceProblem.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/MixedConfigureAndInitializeMissingInstanceProblem.cs 2009-04-19 20:45:09 UTC (rev 237) @@ -0,0 +1,49 @@ +using NUnit.Framework; +using StructureMap.Testing.Widget; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] public class MixedConfigureAndInitializeMissingInstanceProblem + { + private Container container; + + [SetUp] public void SetUp() + { + container = new Container(x => + { + x.ForRequestedType<IWidget>().MissingNamedInstanceIs.Conditional(o => + { + o.TheDefault.Is.ConstructedBy(c => new ColorWidget(c.RequestedName)); + }); + }); + } + + [Test] public void configure_again_and_try_to_fetch_the_missing_instance() + { + container.Configure(x => + { + x.ForRequestedType<IWidget>().TheDefaultIsConcreteType<AWidget>(); + }); + + container.GetInstance<IWidget>("Red").ShouldBeOfType<ColorWidget>().Color.ShouldEqual("Red"); + } + + [Test] public void configure_the_missing_method_instance_in_the_configure() + { + container = new Container(x => + { + x.ForRequestedType<IWidget>().TheDefaultIsConcreteType<AWidget>(); + }); + + container.Configure(x => + { + x.ForRequestedType<IWidget>().MissingNamedInstanceIs.Conditional(o => + { + o.TheDefault.Is.ConstructedBy(c => new ColorWidget(c.RequestedName)); + }); + }); + + container.GetInstance<IWidget>("Red").ShouldBeOfType<ColorWidget>().Color.ShouldEqual("Red"); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2009-04-19 19:17:16 UTC (rev 236) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2009-04-19 20:45:09 UTC (rev 237) @@ -7,7 +7,9 @@ namespace StructureMap.Testing { - [TestFixture] + using StructureMap.Attributes; + + [TestFixture] public class GenericsAcceptanceTester { #region Setup/Teardown @@ -216,6 +218,22 @@ { Assert.IsTrue(GenericsPluginGraph.CanBeCast(typeof (ITarget<,>), typeof (DisposableTarget<,>))); } + + [Test] + public void CanGetTheSameInstanceOfGenericInterfaceWithSingletonScope() + { + Container con = new Container(x => + { + x.ForRequestedType(typeof (IService<>)) + .CacheBy(InstanceScope.Singleton) + .TheDefaultIsConcreteType(typeof (Service<>)); + }); + + var first = con.GetInstance<IService<string>>(); + var second = con.GetInstance<IService<string>>(); + + Assert.AreSame(first, second, "The objects are not the same instance"); + } } @@ -295,4 +313,4 @@ return typeof (T); } } -} \ No newline at end of file +} Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2009-04-19 19:17:16 UTC (rev 236) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2009-04-19 20:45:09 UTC (rev 237) @@ -95,11 +95,13 @@ [Test] public void CloneSingleton() { + var inner = new BuildPolicy(); var policy = new SingletonPolicy(); + policy.InnerPolicy = inner; - var clone = (SingletonPolicy) policy.Clone(); - Assert.AreNotSame(policy, clone); - Assert.IsInstanceOfType(typeof (BuildPolicy), clone.InnerPolicy); + var clone = policy.Clone().ShouldBeOfType<SingletonPolicy>(); + clone.ShouldNotBeTheSameAs(policy); + clone.InnerPolicy.ShouldBeOfType<BuildPolicy>(); } Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 19:17:16 UTC (rev 236) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 20:45:09 UTC (rev 237) @@ -182,6 +182,7 @@ <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> <Compile Include="Bugs\LambdaCreatesNullBugTester.cs" /> + <Compile Include="Bugs\MixedConfigureAndInitializeMissingInstanceProblem.cs" /> <Compile Include="Bugs\ScanIndexerBugTester.cs" /> <Compile Include="Bugs\SingletonShouldBeLazy.cs" /> <Compile Include="Bugs\SpecifyScopeInConfigureTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-04-19 23:48:14
|
Revision: 239 http://structuremap.svn.sourceforge.net/structuremap/?rev=239&view=rev Author: jeremydmiller Date: 2009-04-19 23:48:02 +0000 (Sun, 19 Apr 2009) Log Message: ----------- just about to HACK, HACK, HACK!!!! Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/BuildPolicy.cs trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs trunk/Source/StructureMap/Pipeline/InstanceKey.cs trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs trunk/Source/StructureMap/Pipeline/Lifecycle.cs trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/BuildSession.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -161,6 +161,7 @@ return _defaults[pluginType](); } + [Obsolete("get this inlined")] public virtual object ApplyInterception(Type pluginType, object actualValue) { if (actualValue == null) return null; Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -87,6 +87,7 @@ } } + [Obsolete("Kill!")] public void AddInterceptor(IBuildInterceptor interceptor) { interceptor.InnerPolicy = _buildPolicy; Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -13,6 +13,8 @@ { Type PluginType { get; } IEnumerable<IInstance> Instances { get; } + + [Obsolete("Kill!!!!")] IBuildPolicy Policy { get; } Instance MissingInstance { get; set; } @@ -27,12 +29,18 @@ [Obsolete("Return the list of Instances instead")] IList GetAllInstances(BuildSession session); + [Obsolete("Kill!!!!")] object Build(BuildSession session, Instance instance); + Instance FindInstance(string name); void ImportFrom(PluginFamily family); + + [Obsolete("Kill!!!!")] void EjectAllInstances(); + ILifecycle Lifecycle {get; } + } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -95,6 +95,7 @@ } } + [Obsolete("Kill!!!!")] public IBuildPolicy Policy { get { return _policy; } @@ -132,6 +133,7 @@ return list; } + [Obsolete("Kill!!!!")] public object Build(BuildSession session, Instance instance) { return _policy.Build(session, PluginType, instance); @@ -164,6 +166,11 @@ _instances.Clear(); } + public ILifecycle Lifecycle + { + get { throw new NotImplementedException(); } + } + #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/BuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,7 @@ namespace StructureMap.Pipeline { + [Obsolete("Kill!")] public sealed class BuildPolicy : IBuildPolicy { #region IBuildPolicy Members Modified: trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,10 @@ namespace StructureMap.Pipeline { + + + + [Obsolete("Kill! in favor of MainObjectCache")] public class ObjectCache : Cache<InstanceKey, object> { public ObjectCache(IBuildPolicy innerPolicy) : base(key => innerPolicy.Build(key.Session, key.PluginType, key.Instance)) Modified: trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Web; using StructureMap.Attributes; Added: trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,53 @@ +using System.Collections; +using System.Web; + +namespace StructureMap.Pipeline +{ + public class HttpContextLifecycle : ILifecycle + { + public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; + + + public static bool HasContext() + { + return HttpContext.Current != null; + } + + public static void DisposeAndClearAll() + { + new HttpContextLifecycle().FindCache().DisposeAndClear(); + } + + public void EjectAll() + { + FindCache().DisposeAndClear(); + } + + public IObjectCache FindCache() + { + IDictionary items = findHttpDictionary(); + + if (!items.Contains(ITEM_NAME)) + { + lock (items.SyncRoot) + { + if (!items.Contains(ITEM_NAME)) + { + MainObjectCache cache = new MainObjectCache(); + items.Add(ITEM_NAME, cache); + + return cache; + } + } + } + + return (IObjectCache)items[ITEM_NAME]; + } + + + protected virtual IDictionary findHttpDictionary() + { + return HttpContext.Current.Items; + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,33 @@ +namespace StructureMap.Pipeline +{ + public abstract class HttpLifecycleBase<HTTP, NONHTTP> : ILifecycle + where HTTP : ILifecycle, new() + where NONHTTP : ILifecycle, new() + { + private readonly ILifecycle _http; + private readonly ILifecycle _nonHttp; + + public HttpLifecycleBase() + { + _http = new HTTP(); + _nonHttp = new NONHTTP(); + } + + public void EjectAll() + { + _http.EjectAll(); + _nonHttp.EjectAll(); + } + + public IObjectCache FindCache() + { + return HttpContextLifecycle.HasContext() + ? _http.FindCache() + : _nonHttp.FindCache(); + } + } + + public class HybridLifecycle : HttpLifecycleBase<HttpContextLifecycle, ThreadLocalStorageLifecycle> + { + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Web; using StructureMap.Attributes; @@ -17,6 +18,20 @@ } } + + public class HttpSessionLifecycle : HttpContextLifecycle + { + protected override IDictionary findHttpDictionary() + { + return new SessionWrapper(HttpContext.Current.Session); + } + } + + public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> + { + + } + public class HybridSessionBuildPolicy : HttpBuildPolicyBase<HttpSessionBuildPolicy, ThreadLocalStoragePolicy> { public override IBuildPolicy Clone() Modified: trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -55,6 +55,9 @@ } + + + public class HybridBuildPolicy : HttpBuildPolicyBase<HttpContextBuildPolicy, ThreadLocalStoragePolicy> { public override IBuildPolicy Clone() Modified: trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -5,6 +5,7 @@ /// <summary> /// An object that specifies a "Policy" about how Instance's are invoked. /// </summary> + [Obsolete("Kill!")] public interface IBuildPolicy { object Build(BuildSession buildSession, Type pluginType, Instance instance); Modified: trunk/Source/StructureMap/Pipeline/InstanceKey.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -6,21 +6,29 @@ { public string Name { get; set; } public Type PluginType { get; set; } + [Obsolete("Kill!")] private WeakReference _session; + [Obsolete("Kill!")] private WeakReference _instance; public InstanceKey() { } + public InstanceKey(Instance instance, Type pluginType) + { + Name = instance.Name; + PluginType = pluginType; + } - + [Obsolete("Kill!")] public BuildSession Session { get { return (BuildSession) _session.Target; } set { _session = new WeakReference(value); } } + [Obsolete("Kill!")] public Instance Instance { get Added: trunk/Source/StructureMap/Pipeline/Lifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using StructureMap.Attributes; +using StructureMap.Interceptors; +using StructureMap.Util; + +namespace StructureMap.Pipeline +{ + public interface IObjectCache + { + object Locker { get; } + object Get(Type pluginType, Instance instance); + void Set(Type pluginType, Instance instance, object value); + void DisposeAndClear(); + } + + public class NulloObjectCache : IObjectCache + { + public object Locker + { + get { return new object(); } + } + + public object Get(Type pluginType, Instance instance) + { + return null; + } + + public void Set(Type pluginType, Instance instance, object value) + { + // no-op + } + + public void DisposeAndClear() + { + // no-op + } + } + + public class MainObjectCache : IObjectCache + { + private readonly IDictionary<InstanceKey, object> _objects = new Dictionary<InstanceKey,object>(); + private readonly object _locker = new object(); + + public object Locker + { + get { return _locker; } + } + + public object Get(Type pluginType, Instance instance) + { + var key = new InstanceKey(instance, pluginType); + return _objects.ContainsKey(key) ? _objects[key] : null; + } + + public void Set(Type pluginType, Instance instance, object value) + { + var key = new InstanceKey(instance, pluginType); + _objects.Add(key, value); + } + + public void DisposeAndClear() + { + + lock (Locker) + { + foreach (var @object in _objects.Values) + { + IDisposable disposable = @object as IDisposable; + if (disposable != null) + { + try + { + disposable.Dispose(); + } + catch (Exception) { } + } + } + + _objects.Clear(); + } + } + } + + + public interface ILifecycle + { + void EjectAll(); + IObjectCache FindCache(); + } + + public static class Lifecycles + { + public static ILifecycle GetLifecycle(InstanceScope scope) + { + switch (scope) + { + case InstanceScope.Singleton: + return new SingletonLifecycle(); + + case InstanceScope.HttpContext: + return new HttpContextLifecycle(); + + case InstanceScope.ThreadLocal: + return new ThreadLocalStorageLifecycle(); + + case InstanceScope.Hybrid: + return new HybridLifecycle(); + + case InstanceScope.HttpSession: + return new HttpSessionLifecycle(); + + case InstanceScope.HybridHttpSession: + return new HybridSessionLifecycle(); + } + + throw new ArgumentOutOfRangeException("scope"); + } + } + + public class ObjectBuilder + { + private readonly PipelineGraph _pipeline; + private readonly InterceptorLibrary _library; + private readonly IObjectCache _defaultCache; + + public ObjectBuilder(PipelineGraph pipeline, InterceptorLibrary library, IObjectCache defaultCache) + { + _pipeline = pipeline; + _library = library; + _defaultCache = defaultCache; + } + + public object Resolve(Type pluginType, Instance instance, BuildSession session) + { + var cache = FindCache(instance, session); + lock (cache.Locker) + { + var returnValue = cache.Get(pluginType, instance); + if (returnValue == null) + { + returnValue = ConstructNew(pluginType, instance, session); + + + cache.Set(pluginType, instance, returnValue); + } + + return returnValue; + } + } + + public object ConstructNew(Type pluginType, Instance instance, BuildSession session) + { + object returnValue = instance.Build(pluginType, session); + return ApplyInterception(pluginType, returnValue, session, instance); + } + + public virtual object ApplyInterception(Type pluginType, object actualValue, BuildSession session, Instance instance) + { + if (actualValue == null) return null; + + try + { + return _library.FindInterceptor(actualValue.GetType()).Process(actualValue, session); + } + catch (Exception e) + { + throw new StructureMapException(308, e, instance.Name, actualValue.GetType()); + } + + + } + + public IObjectCache FindCache(Instance instance, BuildSession session) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,17 @@ +namespace StructureMap.Pipeline +{ + public class SingletonLifecycle : ILifecycle + { + private readonly MainObjectCache _cache = new MainObjectCache(); + + public void EjectAll() + { + _cache.DisposeAndClear(); + } + + public IObjectCache FindCache() + { + return _cache; + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,7 @@ namespace StructureMap.Pipeline { + [Obsolete("Kill!")] public class SingletonPolicy : CacheInterceptor { private readonly object _locker = new object(); Added: trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,37 @@ +using System; + +namespace StructureMap.Pipeline +{ + public class ThreadLocalStorageLifecycle : ILifecycle + { + private readonly object _locker = new object(); + + [ThreadStatic] + private static MainObjectCache _cache; + + public void EjectAll() + { + FindCache().DisposeAndClear(); + } + + public IObjectCache FindCache() + { + guaranteeHashExists(); + return _cache; + } + + private void guaranteeHashExists() + { + if (_cache == null) + { + lock (_locker) + { + if (_cache == null) + { + _cache = new MainObjectCache(); + } + } + } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 23:48:02 UTC (rev 239) @@ -407,8 +407,13 @@ <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IContext.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> + <Compile Include="Pipeline\HttpContextLifecycle.cs" /> + <Compile Include="Pipeline\HttpLifecycleBase.cs" /> <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> + <Compile Include="Pipeline\Lifecycle.cs" /> <Compile Include="Pipeline\SessionWrapper.cs" /> + <Compile Include="Pipeline\SingletonLifecycle.cs" /> + <Compile Include="Pipeline\ThreadLocalStorageLifecycle.cs" /> <Compile Include="Pipeline\UniquePerRequestInterceptor.cs" /> <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -38,6 +38,11 @@ _values = dictionary; } + public object Locker + { + get { return _locker; } + } + public Func<KEY, VALUE> OnMissing { set { _onMissing = value; } Added: trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,33 @@ +using NUnit.Framework; +using Rhino.Mocks; +using StructureMap.Graph; +using StructureMap.Interceptors; +using StructureMap.Pipeline; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] public class ObjectBuilderTester + { + private PluginGraph graph; + private PipelineGraph pipeline; + private InterceptorLibrary library; + private IObjectCache theDefaultCache; + private ObjectBuilder builder; + + [SetUp] public void SetUp() + { + graph = new PluginGraph(); + pipeline = new PipelineGraph(graph); + library = new InterceptorLibrary(); + + theDefaultCache = MockRepository.GenerateMock<IObjectCache>(); + + builder = new ObjectBuilder(pipeline, library, theDefaultCache); + } + + [Test] public void FIRSTTEST() + { + + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 23:48:02 UTC (rev 239) @@ -353,6 +353,7 @@ <Compile Include="Pipeline\InstanceTester.cs" /> <Compile Include="Pipeline\LiteralInstanceTester.cs" /> <Compile Include="Pipeline\MissingInstanceTester.cs" /> + <Compile Include="Pipeline\ObjectBuilderTester.cs" /> <Compile Include="Pipeline\OptionalSetterInjectionTester.cs" /> <Compile Include="Pipeline\ProfileManagerMergeTester.cs" /> <Compile Include="Pipeline\ProfileManagerTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-04-20 01:47:22
|
Revision: 240 http://structuremap.svn.sourceforge.net/structuremap/?rev=240&view=rev Author: jeremydmiller Date: 2009-04-20 01:47:17 +0000 (Mon, 20 Apr 2009) Log Message: ----------- The big, big lifecycle refactoring Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs trunk/Source/StructureMap/Graph/IPluginFamily.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/Lifecycle.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/PluginTypeConfiguration.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/SystemRegistry.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildLifecycleTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStorageLifecycleTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildPolicyTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/BuildSession.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -11,14 +11,15 @@ private readonly BuildStack _buildStack = new BuildStack(); private readonly InstanceCache _cache = new InstanceCache(); private readonly Cache<Type, Func<object>> _defaults; - private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; + private readonly ObjectBuilder _builder; public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary) { _pipelineGraph = pipelineGraph; - _interceptorLibrary = interceptorLibrary; + _builder = new ObjectBuilder(_pipelineGraph, interceptorLibrary, new NulloObjectCache()); + _defaults = new Cache<Type, Func<object>>(t => { Instance instance = _pipelineGraph.GetDefault(t); @@ -28,9 +29,7 @@ throw new StructureMapException(202, t); } - object createdInstance = CreateInstance(t, instance); - - return () => createdInstance; + return () => CreateInstance(t, instance); }); } @@ -129,9 +128,14 @@ if (result == null) { - result = forType(pluginType).Build(this, instance); + result = _builder.Resolve(pluginType, instance, this); - _cache.Set(pluginType, instance, result); + // TODO: HACK ATTACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + var isUnique = forType(pluginType).Lifecycle is UniquePerRequestLifecycle; + if (!isUnique) + { + _cache.Set(pluginType, instance, result); + } } return result; @@ -161,13 +165,6 @@ return _defaults[pluginType](); } - [Obsolete("get this inlined")] - public virtual object ApplyInterception(Type pluginType, object actualValue) - { - if (actualValue == null) return null; - return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue, this); - } - public virtual void RegisterDefault(Type pluginType, Func<object> creator) { _defaults[pluginType] = creator; Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -261,30 +261,18 @@ } /// <summary> - /// Registers an IBuildInterceptor for this Plugin Type that executes before - /// any object of this PluginType is created. IBuildInterceptor's can be + /// Registers an ILifecycle for this Plugin Type that executes before + /// any object of this PluginType is created. ILifecycle's can be /// used to create a custom scope /// </summary> - /// <param name="interceptor"></param> + /// <param name="lifecycle"></param> /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> InterceptConstructionWith(IBuildInterceptor interceptor) + public CreatePluginFamilyExpression<PLUGINTYPE> LifecycleIs(ILifecycle lifecycle) { - _alterations.Add(family => family.AddInterceptor(interceptor)); + _alterations.Add(family => family.SetScopeTo(lifecycle)); return this; } - /// <summary> - /// Registers an IBuildInterceptor for this Plugin Type that executes before - /// any object of this PluginType is created. IBuildInterceptor's can be - /// used to create a custom scope - /// </summary> - /// <param name="interceptor"></param> - /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> BuildPolicyIs(IBuildInterceptor interceptor) - { - _alterations.Add(family => family.AddInterceptor(interceptor)); - return this; - } /// <summary> /// Largely deprecated and unnecessary with the ability to add Xml configuration files @@ -314,7 +302,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> AlwaysUnique() { - return InterceptConstructionWith(new UniquePerRequestInterceptor()); + return this.LifecycleIs(new UniquePerRequestLifecycle()); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -144,11 +144,11 @@ /// any object of this PluginType is created. IBuildInterceptor's can be /// used to create a custom scope /// </summary> - /// <param name="interceptor"></param> + /// <param name="lifecycle"></param> /// <returns></returns> - public GenericFamilyExpression InterceptConstructionWith(IBuildInterceptor interceptor) + public GenericFamilyExpression LifecycleIs(ILifecycle lifecycle) { - return alterAndContinue(family => family.AddInterceptor(interceptor)); + return alterAndContinue(family => family.SetScopeTo(lifecycle)); } /// <summary> Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -127,10 +127,12 @@ { var interceptorMemento = new XmlAttributeInstanceMemento(element); string context = contextBase + element.OuterXml; - _builder.WithSystemObject<IBuildInterceptor>( + + + _builder.WithSystemObject<ILifecycle>( interceptorMemento, context, - interceptor => family.AddInterceptor(interceptor)); + lifecycle => family.SetScopeTo(lifecycle)); }); } } Modified: trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -79,7 +79,14 @@ _writer.AddText(contents); - _writer.AddContent("Scoped as: " + pluginType.Policy); + if (pluginType.Lifecycle != null) + { + _writer.AddContent("Scoped as: " + pluginType.Lifecycle.GetType().Name); + } + else + { + _writer.AddContent("Scoped as: PerRequest"); + } foreach (IInstance instance in pluginType.Instances) { Modified: trunk/Source/StructureMap/Graph/IPluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -19,6 +19,8 @@ void AddMementoSource(MementoSource source); void SetScopeTo(InstanceScope scope); - void AddInterceptor(IBuildInterceptor interceptor); + void SetScopeTo(ILifecycle lifecycle); + + ILifecycle Lifecycle {get; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -17,7 +17,7 @@ private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>(); private readonly Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); private readonly Type _pluginType; - private IBuildPolicy _buildPolicy = new BuildPolicy(); + private ILifecycle _lifecycle = null; private string _defaultKey = string.Empty; private PluginGraph _parent; @@ -43,7 +43,16 @@ } } + public void SetScopeTo(ILifecycle lifecycle) + { + _lifecycle = lifecycle; + } + public ILifecycle Lifecycle + { + get { return _lifecycle; } + } + public PluginGraph Parent { get { return _parent; } @@ -59,40 +68,9 @@ public void SetScopeTo(InstanceScope scope) { - switch (scope) - { - case InstanceScope.Singleton: - AddInterceptor(new SingletonPolicy()); - break; - - case InstanceScope.HttpContext: - AddInterceptor(new HttpContextBuildPolicy()); - break; - - case InstanceScope.ThreadLocal: - AddInterceptor(new ThreadLocalStoragePolicy()); - break; - - case InstanceScope.Hybrid: - AddInterceptor(new HybridBuildPolicy()); - break; - - case InstanceScope.HttpSession: - AddInterceptor(new HybridSessionBuildPolicy()); - break; - - case InstanceScope.HybridHttpSession: - AddInterceptor(new HybridSessionBuildPolicy()); - break; - } + _lifecycle = Lifecycles.GetLifecycle(scope); } - [Obsolete("Kill!")] - public void AddInterceptor(IBuildInterceptor interceptor) - { - interceptor.InnerPolicy = _buildPolicy; - _buildPolicy = interceptor; - } #endregion @@ -292,7 +270,7 @@ Type templatedType = _pluginType.MakeGenericType(templateTypes); var templatedFamily = new PluginFamily(templatedType, Parent); templatedFamily.DefaultInstanceKey = DefaultInstanceKey; - templatedFamily.Policy = Policy.Clone(); + templatedFamily._lifecycle = _lifecycle; // TODO -- Got a big problem here. Intances need to be copied over @@ -330,7 +308,7 @@ { Default = GetDefaultInstance(), PluginType = PluginType, - Policy = _buildPolicy, + Lifecycle = _lifecycle, Instances = Instances }; } @@ -342,11 +320,7 @@ get { return _pluginType.IsGenericTypeDefinition || _pluginType.ContainsGenericParameters; } } - public IBuildPolicy Policy - { - get { return _buildPolicy; } - set { _buildPolicy = value; } - } + public int PluginCount { Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -13,9 +13,6 @@ { Type PluginType { get; } IEnumerable<IInstance> Instances { get; } - - [Obsolete("Kill!!!!")] - IBuildPolicy Policy { get; } Instance MissingInstance { get; set; } Instance[] AllInstances @@ -26,12 +23,6 @@ void AddInstance(Instance instance); Instance AddType<T>(); - [Obsolete("Return the list of Instances instead")] - IList GetAllInstances(BuildSession session); - - [Obsolete("Kill!!!!")] - object Build(BuildSession session, Instance instance); - Instance FindInstance(string name); void ImportFrom(PluginFamily family); Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -16,7 +16,7 @@ new Cache<string, Instance>(delegate { return null; }); private readonly Type _pluginType; - private IBuildPolicy _policy = new BuildPolicy(); + private ILifecycle _lifecycle; #region constructor functions @@ -38,7 +38,7 @@ try { - _policy = family.Policy; + _lifecycle = family.Lifecycle; _pluginType = family.PluginType; MissingInstance = family.MissingInstance; @@ -95,14 +95,7 @@ } } - [Obsolete("Kill!!!!")] - public IBuildPolicy Policy - { - get { return _policy; } - set { _policy = value; } - } - public void AddInstance(Instance instance) { _instances[instance.Name] = instance; @@ -120,25 +113,6 @@ return instance; } - public IList GetAllInstances(BuildSession session) - { - IList list = new ArrayList(); - - _instances.Each(instance => - { - object builtObject = Build(session, instance); - list.Add(builtObject); - }); - - return list; - } - - [Obsolete("Kill!!!!")] - public object Build(BuildSession session, Instance instance) - { - return _policy.Build(session, PluginType, instance); - } - public Instance FindInstance(string name) { return _instances[name] ?? MissingInstance; @@ -146,10 +120,14 @@ public void ImportFrom(PluginFamily family) { - if (!_policy.GetType().Equals(family.Policy.GetType())) + if (_lifecycle == null) { + _lifecycle = family.Lifecycle; + } + else if (!_lifecycle.GetType().Equals(family.Lifecycle.GetType())) + { // TODO: Might need to clear out the existing policy when it's ejected - _policy = family.Policy; + _lifecycle = family.Lifecycle; } family.EachInstance(instance => _instances.Fill(instance.Name, instance)); @@ -162,13 +140,14 @@ public void EjectAllInstances() { - _policy.EjectAll(); + if (_lifecycle != null) _lifecycle.EjectAll(); _instances.Clear(); } public ILifecycle Lifecycle { - get { throw new NotImplementedException(); } + get { return _lifecycle; } + set { _lifecycle = value; } } #endregion Deleted: trunk/Source/StructureMap/Pipeline/BuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,65 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - [Obsolete("Kill!")] - public sealed class BuildPolicy : IBuildPolicy - { - #region IBuildPolicy Members - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - if (buildSession == null) - { - throw new ArgumentNullException("buildSession"); - } - - object builtObject = instance.Build(pluginType, buildSession); - - try - { - return buildSession.ApplyInterception(pluginType, builtObject); - } - catch (Exception e) - { - throw new StructureMapException(308, e, instance.Name, builtObject.GetType()); - } - } - - public IBuildPolicy Clone() - { - return this; - } - - public void EjectAll() - { - // no-op. Unlike other Container's, StructureMap doesn't hang on to - // objects it created as "Transients" - } - - #endregion - - public bool Equals(BuildPolicy obj) - { - return !ReferenceEquals(null, obj); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - return obj is BuildPolicy; - } - - public override int GetHashCode() - { - return 0; - } - - public override string ToString() - { - return InstanceScope.PerRequest.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,86 +0,0 @@ -using System; -using StructureMap.Util; - -namespace StructureMap.Pipeline -{ - - - - [Obsolete("Kill! in favor of MainObjectCache")] - public class ObjectCache : Cache<InstanceKey, object> - { - public ObjectCache(IBuildPolicy innerPolicy) : base(key => innerPolicy.Build(key.Session, key.PluginType, key.Instance)) - { - } - - public void DisposeAndClear() - { - Each(o => - { - IDisposable disposable = o as IDisposable; - if (disposable != null) - { - try - { - disposable.Dispose(); - } - catch (Exception) { } - } - }); - Clear(); - } - } - - public abstract class CacheInterceptor : IBuildInterceptor - { - private IBuildPolicy _innerPolicy = new BuildPolicy(); - - #region IBuildInterceptor Members - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set { _innerPolicy = value; } - } - - protected ObjectCache buildNewCache() - { - return new ObjectCache(_innerPolicy); - } - - protected abstract ObjectCache findCache(); - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - var key = new InstanceKey{Instance = instance, PluginType = pluginType, Session = buildSession}; - return findCache()[key]; - } - - public IBuildPolicy Clone() - { - CacheInterceptor clonedCache = clone(); - clonedCache.InnerPolicy = _innerPolicy.Clone(); - - return clonedCache; - } - - public void EjectAll() - { - ejectAll(); - _innerPolicy.EjectAll(); - } - - protected virtual void ejectAll() - { - } - - #endregion - - protected abstract CacheInterceptor clone(); - - public override string ToString() - { - return GetType().FullName + " / " + _innerPolicy; - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,59 +0,0 @@ -using System; -using System.Collections; -using System.Web; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public class HttpContextBuildPolicy : CacheInterceptor - { - public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; - - - public static bool HasContext() - { - return HttpContext.Current != null; - } - - public static void DisposeAndClearAll() - { - new HttpContextBuildPolicy().findCache().DisposeAndClear(); - } - - protected override ObjectCache findCache() - { - IDictionary items = findHttpDictionary(); - - if (!items.Contains(ITEM_NAME)) - { - lock (items.SyncRoot) - { - if (!items.Contains(ITEM_NAME)) - { - ObjectCache cache = buildNewCache(); - items.Add(ITEM_NAME, cache); - - return cache; - } - } - } - - return (ObjectCache) items[ITEM_NAME]; - } - - protected virtual IDictionary findHttpDictionary() - { - return HttpContext.Current.Items; - } - - protected override CacheInterceptor clone() - { - return this; - } - - public override string ToString() - { - return InstanceScope.HttpContext.ToString(); - } - } -} Added: trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,13 @@ +using System.Collections; +using System.Web; + +namespace StructureMap.Pipeline +{ + public class HttpSessionLifecycle : HttpContextLifecycle + { + protected override IDictionary findHttpDictionary() + { + return new SessionWrapper(HttpContext.Current.Session); + } + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,74 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public abstract class HttpBuildPolicyBase<HTTP, NONHTTP> : IBuildInterceptor - where HTTP : IBuildInterceptor, new() - where NONHTTP : IBuildInterceptor, new() - { - private readonly IBuildInterceptor _http; - private readonly IBuildInterceptor _nonHttp; - - public HttpBuildPolicyBase() - { - _http = new HTTP(); - _nonHttp = new NONHTTP(); - } - - - private IBuildPolicy _innerPolicy; - - - private IBuildInterceptor interceptor - { - get - { - return HttpContextBuildPolicy.HasContext() - ? _http - : _nonHttp; - } - } - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set - { - _http.InnerPolicy = value; - _nonHttp.InnerPolicy = value; - _innerPolicy = value; - } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - return interceptor.Build(buildSession, pluginType, instance); - } - - public abstract IBuildPolicy Clone(); - public void EjectAll() - { - _http.EjectAll(); - _nonHttp.EjectAll(); - } - } - - - - - - public class HybridBuildPolicy : HttpBuildPolicyBase<HttpContextBuildPolicy, ThreadLocalStoragePolicy> - { - public override IBuildPolicy Clone() - { - return new HybridBuildPolicy(){InnerPolicy = InnerPolicy.Clone()}; - } - - public override string ToString() - { - return InstanceScope.Hybrid.ToString(); - } - } - -} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,7 @@ +namespace StructureMap.Pipeline +{ + public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> + { + + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,10 +0,0 @@ -namespace StructureMap.Pipeline -{ - /// <summary> - /// Plugin interface to create custom build or lifecycle policies for a Plugin Type - /// </summary> - public interface IBuildInterceptor : IBuildPolicy - { - IBuildPolicy InnerPolicy { get; set; } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,15 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - /// <summary> - /// An object that specifies a "Policy" about how Instance's are invoked. - /// </summary> - [Obsolete("Kill!")] - public interface IBuildPolicy - { - object Build(BuildSession buildSession, Type pluginType, Instance instance); - IBuildPolicy Clone(); - void EjectAll(); - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Lifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -9,6 +9,12 @@ public interface IObjectCache { object Locker { get; } + + int Count + { + get; + } + object Get(Type pluginType, Instance instance); void Set(Type pluginType, Instance instance, object value); void DisposeAndClear(); @@ -21,6 +27,11 @@ get { return new object(); } } + public int Count + { + get { return 0; } + } + public object Get(Type pluginType, Instance instance) { return null; @@ -47,6 +58,11 @@ get { return _locker; } } + public int Count + { + get { return _objects.Count; } + } + public object Get(Type pluginType, Instance instance) { var key = new InstanceKey(instance, pluginType); @@ -95,6 +111,9 @@ { switch (scope) { + case InstanceScope.PerRequest: + return null; + case InstanceScope.Singleton: return new SingletonLifecycle(); @@ -133,7 +152,7 @@ public object Resolve(Type pluginType, Instance instance, BuildSession session) { - var cache = FindCache(instance, session); + var cache = FindCache(pluginType, instance, session); lock (cache.Locker) { var returnValue = cache.Get(pluginType, instance); @@ -171,9 +190,12 @@ } - public IObjectCache FindCache(Instance instance, BuildSession session) + public IObjectCache FindCache(Type pluginType, Instance instance, BuildSession session) { - throw new NotImplementedException(); + var lifecycle = _pipeline.ForType(pluginType).Lifecycle; + return lifecycle == null + ? _defaultCache + : lifecycle.FindCache(); } } } \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,54 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - [Obsolete("Kill!")] - public class SingletonPolicy : CacheInterceptor - { - private readonly object _locker = new object(); - private ObjectCache _cache; - - protected override ObjectCache findCache() - { - if (_cache == null) - { - lock (_locker) - { - if (_cache == null) - { - _cache = buildNewCache(); - } - } - } - - return _cache; - } - - public ObjectCache Cache - { - get - { - return findCache(); - } - } - - protected override void ejectAll() - { - lock (_locker) - { - _cache.DisposeAndClear(); - } - } - - protected override CacheInterceptor clone() - { - return new SingletonPolicy(); - } - - public override string ToString() - { - return InstanceScope.Singleton.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,46 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public class ThreadLocalStoragePolicy : CacheInterceptor - { - [ThreadStatic] private static ObjectCache _cache; - private readonly object _locker = new object(); - - public static void DisposeAndClearAll() - { - _cache.DisposeAndClear(); - } - - private void guaranteeHashExists() - { - if (_cache == null) - { - lock (_locker) - { - if (_cache == null) - { - _cache = buildNewCache(); - } - } - } - } - - protected override ObjectCache findCache() - { - guaranteeHashExists(); - return _cache; - } - - protected override CacheInterceptor clone() - { - return this; - } - - public override string ToString() - { - return InstanceScope.Hybrid.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,46 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - /// <summary> - /// Makes sure that every request for this object returns a unique object - /// </summary> - public class UniquePerRequestInterceptor : IBuildInterceptor - { - - #region IBuildInterceptor Members - - private IBuildPolicy _innerPolicy = new BuildPolicy(); - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set { _innerPolicy = value; } - } - - #endregion - - #region IBuildPolicy Members - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - //insert a default object creator - buildSession.RegisterDefault(pluginType, () => InnerPolicy.Build(buildSession, pluginType, instance)); - - //build this object for the first time - return buildSession.CreateInstance(pluginType); - } - - public IBuildPolicy Clone() - { - return new UniquePerRequestInterceptor(); - } - - public void EjectAll() - { - InnerPolicy.EjectAll(); - } - - #endregion - } -} Copied: trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs (from rev 234, trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs) =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,55 @@ +using System; + +namespace StructureMap.Pipeline +{ + /// <summary> + /// Makes sure that every request for this object returns a unique object + /// </summary> + public class UniquePerRequestLifecycle : ILifecycle + { + public void EjectAll() + { + + } + + public IObjectCache FindCache() + { + return new NulloObjectCache(); + } + + //#region IBuildInterceptor Members + + //private IBuildPolicy _innerPolicy = new BuildPolicy(); + + //public IBuildPolicy InnerPolicy + //{ + // get { return _innerPolicy; } + // set { _innerPolicy = value; } + //} + + //#endregion + + //#region IBuildPolicy Members + + //public object Build(BuildSession buildSession, Type pluginType, Instance instance) + //{ + // //insert a default object creator + // buildSession.RegisterDefault(pluginType, () => InnerPolicy.Build(buildSession, pluginType, instance)); + + // //build this object for the first time + // return buildSession.CreateInstance(pluginType); + //} + + //public IBuildPolicy Clone() + //{ + // return new UniquePerRequestInterceptor(); + //} + + //public void EjectAll() + //{ + // InnerPolicy.EjectAll(); + //} + + //#endregion + } +} Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -75,7 +75,7 @@ { Default = _profileManager.GetDefault(factory.PluginType), PluginType = factory.PluginType, - Policy = factory.Policy, + Lifecycle = factory.Lifecycle, Instances = factory.Instances }; } Modified: trunk/Source/StructureMap/PluginTypeConfiguration.cs =================================================================== --- trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -20,7 +20,7 @@ /// <summary> /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods /// </summary> - public IBuildPolicy Policy { get; set; } + public ILifecycle Lifecycle { get; set; } /// <summary> /// All of the <see cref="StructureMap.Pipeline.IInstance">IInstance</see>'s registered Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-04-20 01:47:17 UTC (rev 240) @@ -157,15 +157,10 @@ <Compile Include="InstanceFamily.cs" /> <Compile Include="Interceptors\MatchedTypeInterceptor.cs" /> <Compile Include="PipelineGraph.cs" /> - <Compile Include="Pipeline\BuildPolicy.cs" /> - <Compile Include="Pipeline\CacheInterceptor.cs" /> <Compile Include="Pipeline\ConfiguredInstance.cs" /> <Compile Include="Pipeline\ConfiguredInstance.Expressions.cs" /> <Compile Include="Pipeline\ConstructorInstance.cs" /> <Compile Include="Pipeline\DefaultInstance.cs" /> - <Compile Include="Pipeline\HybridBuildPolicy.cs" /> - <Compile Include="Pipeline\IBuildInterceptor.cs" /> - <Compile Include="Pipeline\IBuildPolicy.cs" /> <Compile Include="Pipeline\IConfiguredInstance.cs" /> <Compile Include="Pipeline\ILocationPolicy.cs" /> <Compile Include="Pipeline\Instance.cs" /> @@ -175,8 +170,6 @@ <Compile Include="Pipeline\ProfileManager.cs" /> <Compile Include="Pipeline\PrototypeInstance.cs" /> <Compile Include="Pipeline\ReferencedInstance.cs" /> - <Compile Include="Pipeline\SingletonPolicy.cs" /> - <Compile Include="Pipeline\ThreadLocalStoragePolicy.cs" /> <Compile Include="Pipeline\UserControlInstance.cs" /> <Compile Include="Properties\AssemblyInfo.cs"> <SubType>Code</SubType> @@ -409,12 +402,13 @@ <Compile Include="Pipeline\ConditionalInstance.cs" /> <Compile Include="Pipeline\HttpContextLifecycle.cs" /> <Compile Include="Pipeline\HttpLifecycleBase.cs" /> - <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> + <Compile Include="Pipeline\HttpSessionLifecycle.cs" /> + <Compile Include="Pipeline\HybridSessionLifecycle.cs" /> <Compile Include="Pipeline\Lifecycle.cs" /> <Compile Include="Pipeline\SessionWrapper.cs" /> <Compile Include="Pipeline\SingletonLifecycle.cs" /> <Compile Include="Pipeline\ThreadLocalStorageLifecycle.cs" /> - <Compile Include="Pipeline\UniquePerRequestInterceptor.cs" /> + <Compile Include="Pipeline\UniquePerRequestLifecycle.cs" /> <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> @@ -422,7 +416,6 @@ <Compile Include="Pipeline\BuildFrame.cs" /> <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> - <Compile Include="Pipeline\HttpContextBuildPolicy.cs" /> <Compile Include="Pipeline\InstanceKey.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> <Compile Include="Pipeline\PropertyExpression.cs" /> Modified: trunk/Source/StructureMap/SystemRegistry.cs =================================================================== --- trunk/Source/StructureMap/SystemRegistry.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/SystemRegistry.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -9,7 +9,7 @@ { public SystemRegistry() { - addExpression(graph => graph.AddType(typeof(MementoSource), typeof(XmlFileMementoSource), "XmlFile")); + addExpression(graph => graph.AddType(typeof (MementoSource), typeof (XmlFileMementoSource), "XmlFile")); ForRequestedType<MementoSource>().TheDefaultIsConcreteType<MemoryMementoSource>(); AddMementoSourceType<DirectoryXmlMementoSource>("DirectoryXml"); @@ -19,23 +19,23 @@ AddMementoSourceType<XmlAttributeFileMementoSource>("XmlAttributeFile"); AddMementoSourceType<XmlFileMementoSource>("XmlFile"); + AddLifecycleType<SingletonLifecycle>(InstanceScope.Singleton); + AddLifecycleType<HttpContextLifecycle>(InstanceScope.HttpContext); + AddLifecycleType<HttpSessionLifecycle>(InstanceScope.HttpSession); + AddLifecycleType<HybridLifecycle>(InstanceScope.Hybrid); + AddLifecycleType<HybridSessionLifecycle>(InstanceScope.HybridHttpSession); + AddLifecycleType<ThreadLocalStorageLifecycle>(InstanceScope.ThreadLocal); + } - AddInterceptorType<SingletonPolicy>(InstanceScope.Singleton); - AddInterceptorType<ThreadLocalStoragePolicy>(InstanceScope.ThreadLocal); - AddInterceptorType<HttpContextBuildPolicy>(InstanceScope.HttpContext); - AddInterceptorType<HttpSessionBuildPolicy>(InstanceScope.HttpSession); - AddInterceptorType<HybridBuildPolicy>(InstanceScope.Hybrid); + private void AddLifecycleType<T>(InstanceScope scope) where T : ILifecycle + { + addExpression(graph => graph.AddType(typeof(ILifecycle), typeof(T), scope.ToString())); } private void AddMementoSourceType<T>(string name) { - addExpression(graph => graph.AddType(typeof(MementoSource), typeof(T), name)); + addExpression(graph => graph.AddType(typeof (MementoSource), typeof (T), name)); } - - private void AddInterceptorType<T>(InstanceScope scope) - { - addExpression(graph => graph.AddType(typeof(IBuildInterceptor), typeof(T), scope.ToString())); - } } } \ No newline at end of file Modified: trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs =================================================================== --- trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -37,7 +37,7 @@ instances.Add(buildInstanceDetail(instance)); } - var pluginTypeDetail = new PluginTypeDetail(pluginType.PluginType, pluginType.Policy.GetType(), instances.ToArray()); + var pluginTypeDetail = new PluginTypeDetail(pluginType.PluginType, pluginType.Lifecycle.GetType(), instances.ToArray()); pluginTypeDetails.Add(pluginTypeDetail); } Modified: trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs =================================================================== --- trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -12,7 +12,7 @@ [Test] public void can_serialize_container_details() { - var pluginTypeDetails = new[]{ new PluginTypeDetail(typeof(string), typeof(BuildPolicy), new[]{ new InstanceDetail("First", "First Instance", typeof(string)), }) }; + var pluginTypeDetails = new[]{ new PluginTypeDetail(typeof(string), typeof(object), new[]{ new InstanceDetail("First", "First Instance", typeof(string)), }) }; var wrapper = new ContainerDetail(new[]{"config"}, pluginTypeDetails); var binaryFormatter = new BinaryFormatter(); Stream stream = new MemoryStream(); Modified: trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -19,7 +19,7 @@ var family = new PluginFamily(typeof (TypeThatDoesNotHaveCustomMementoSource)); att.Configure(family); - Assert.IsInstanceOfType(interceptorType, family.Policy); + Assert.IsInstanceOfType(interceptorType, family.Lifecycle); } [PluginFamily] @@ -120,10 +120,10 @@ [Test] public void ScopeToInterceptorTypes() { - assertScopeLeadsToInterceptor(InstanceScope.HttpContext, typeof (HttpContextBuildPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.Hybrid, typeof (HybridBuildPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.Singleton, typeof (SingletonPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.ThreadLocal, typeof (ThreadLocalStoragePolicy)); + assertScopeLeadsToInterceptor(InstanceScope.HttpContext, typeof (HttpContextLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.Hybrid, typeof (HybridLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.Singleton, typeof (SingletonLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.ThreadLocal, typeof (ThreadLocalStorageLifecycle)); } [Test] Modified: trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,25 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; +using NUnit.Framework; using StructureMap.Attributes; using StructureMap.Testing.Widget3; namespace StructureMap.Testing.Bugs { - [TestFixture] - public class SpecifyScopeInConfigureTester + [TestFixture] public class SpecifyScopeInConfigureTester { - [Test] - public void specify_the_scope_in_a_Configure_if_it_is_not_already_set() + [Test] public void specify_the_scope_in_a_Configure_if_it_is_not_already_set() { var container = new Container(x => { }); container.Configure(x => { x.ForRequestedType<IGateway>().CacheBy(InstanceScope.Singleton) .TheDefaultIsConcreteType<DefaultGateway>(); - }); var gateway1 = container.GetInstance<IGateway>(); @@ -30,4 +23,4 @@ gateway1.ShouldBeTheSameAs(gateway3); } } -} +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -110,7 +110,8 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (ThreadLocalStoragePolicy), family.Policy); + + family.Lifecycle.ShouldBeOfType<ThreadLocalStorageLifecycle>(); } @@ -136,7 +137,7 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); + family.Lifecycle.ShouldBeNull(); } [Test] @@ -149,7 +150,7 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (SingletonPolicy), family.Policy); + family.Lifecycle.ShouldBeOfType<SingletonLifecycle>(); } [Test] @@ -198,14 +199,14 @@ [Test] public void PutAnInterceptorIntoTheInterceptionChainOfAPluginFamilyInTheDSL() { - var factoryInterceptor = new StubbedInstanceFactoryInterceptor(); + var lifecycle = new StubbedLifecycle(); var registry = new Registry(); - registry.BuildInstancesOf<IGateway>().InterceptConstructionWith(factoryInterceptor); + registry.BuildInstancesOf<IGateway>().LifecycleIs(lifecycle); PluginGraph pluginGraph = registry.Build(); - Assert.AreSame(pluginGraph.FindFamily(typeof (IGateway)).Policy, factoryInterceptor); + pluginGraph.FindFamily(typeof (IGateway)).Lifecycle.ShouldBeTheSameAs(lifecycle); } [Test] @@ -270,31 +271,16 @@ } } - public class StubbedInstanceFactoryInterceptor : IBuildInterceptor + public class StubbedLifecycle : ILifecycle { - #region IBuildInterceptor Members - - public IBuildPolicy InnerPolicy + public void EjectAll() { - get { throw new NotImplementedException(); } - set { } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { throw new NotImplementedException(); } - public IBuildPolicy Clone() + public IObjectCache FindCache() { throw new NotImplementedException(); } - - public void EjectAll() - { - throw new System.NotImplementedException(); - } - - #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -41,34 +41,7 @@ } } - public class TestingBuildPolicy : IBuildInterceptor - { - #region IBuildInterceptor Members - public IBuildPolicy InnerPolicy - { - get { throw new NotImplementedException(); } - set { } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - throw new NotImplementedException(); - } - - public IBuildPolicy Clone() - { - throw new NotImplementedException(); - } - - public void EjectAll() - { - throw new System.NotImplementedException(); - } - - #endregion - } - public interface IRepository<T> { void Save(T subject); @@ -188,17 +161,6 @@ } [Test] - public void Intercept_construction_with() - { - var registry = new Registry(); - var policy = new TestingBuildPolicy(); - registry.ForRequestedType(typeof (ITarget)).InterceptConstructionWith(policy); - PluginGraph graph = registry.Build(); - - Assert.AreSame(policy, graph.FindFamily(typeof (ITarget)).Policy); - } - - [Test] public void On_creation() { ITarget created = null; @@ -219,7 +181,7 @@ registry.ForRequestedType(typeof (ITarget)).CacheBy(InstanceScope.ThreadLocal); PluginGraph graph = registry.Build(); - Assert.IsInstanceOfType(typeof (ThreadLocalStoragePolicy), graph.FindFamily(typeof (ITarget)).Policy); + graph.FindFamily(typeof (ITarget)).Lifecycle.ShouldBeOfType<ThreadLocalStorageLifecycle>(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -44,19 +44,21 @@ private Type thePluginType; private PluginGraph _graph; - private void assertThatTheFamilyPolicyIs<T>() + private void assertThatTheFamilyLifecycleIs<T>() { _parser.ParseFamily(_familyElement); PluginFamily family = _graph.FindFamily(thePluginType); - Assert.IsInstanceOfType(typeof (T), family.Policy); + Assert.IsInstanceOfType(typeof (T), family.Lifecycle); } [Test] public void ScopeIsBlank() { - assertThatTheFamilyPolicyIs<BuildPolicy>(); + _parser.ParseFamily(_familyElement); + + _graph.FindFamily(thePluginType).Lifecycle.ShouldBeNull(); } @@ -64,7 +66,9 @@ public void ScopeIsBlank2() { _familyElement.SetAttribute(XmlConstants.SCOPE, ""); - assertThatTheFamilyPolicyIs<BuildPolicy>(); + _parser.ParseFamily(_familyElement); + + _graph.FindFamily(thePluginType).Lifecycle.ShouldBeNull(); } @@ -72,7 +76,7 @@ public void ScopeIsSingleton() { _familyElement.SetAttribute(XmlConstants.SCOPE, InstanceScope.Singleton.ToString()); - assertThatTheFamilyPolicyIs<SingletonPolicy>(); + assertThatTheFamilyLifecycleIs<SingletonLifecycle>(); } @@ -80,7 +84,7 @@ public void ScopeIsThreadLocal() { _familyElement.SetAttribute(XmlConstants.SCOPE, InstanceScope.ThreadLocal.ToString()); - assertThatTheFamilyPolicyIs<ThreadLocalStoragePolicy>(); + assertThatTheFamilyLifecycleIs<ThreadLocalStorageLifecycle>(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -3,6 +3,7 @@ using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Source; using StructureMap.Testing.Widget3; namespace StructureMap.Testing.Configuration @@ -57,14 +58,18 @@ [Test] public void Create_system_object_successfully_and_call_the_requested_action() { - var memento = new MemoryInstanceMemento("Singleton", "anything"); + var memento = new MemoryInstanceMemento("XmlFile", "anything"); + memento.SetProperty("FilePath", "something"); + memento.SetProperty("XPath", "nodeName"); + memento.SetProperty("NodeName", "something"); + bool iWasCalled = false; var builder = new GraphBuilder(new Registry[0]); - builder.WithSystemObject<IBuildInterceptor>(memento, "singleton", policy => + builder.WithSystemObject<MementoSource>(memento, "some xml", policy => { - Assert.IsInstanceOfType(typeof (SingletonPolicy), policy); + Assert.IsInstanceOfType(typeof(XmlFileMementoSource), policy); iWasCalled = true; }); Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMa... [truncated message content] |
From: <jer...@us...> - 2009-05-18 21:40:20
|
Revision: 241 http://structuremap.svn.sourceforge.net/structuremap/?rev=241&view=rev Author: jeremydmiller Date: 2009-05-18 21:40:09 +0000 (Mon, 18 May 2009) Log Message: ----------- little helper thing for open generic type scanning Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/ITypeScanner.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -371,5 +371,24 @@ } + /// <summary> + /// Syntactic Sugar for saying ForRequestedType().TheDefault.IsThis( @object ) + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <param name="object"></param> + public void Register<PLUGINTYPE>(PLUGINTYPE @object) + { + ForRequestedType<PLUGINTYPE>().TheDefault.IsThis(@object); + } + + /// <summary> + /// Syntactic Sugar for saying ForRequestedType().TheDefault.IsThis( instance ) + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <param name="instance"></param> + public void Register<PLUGINTYPE>(Instance instance) + { + ForRequestedType<PLUGINTYPE>().TheDefault.IsThis(instance); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap/Container.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -434,6 +434,15 @@ return new ExplicitArgsExpression(this).With(argName); } + public ExplicitArgsExpression With(Action<ExplicitArgsExpression> action) + { + var expression = new ExplicitArgsExpression(this); + action(expression); + + return expression; + } + + /// <summary> /// Use with caution! Does a full environment test of the configuration of this container. Will try to create every configured /// instance and afterward calls any methods marked with the [ValidationMethod] attribute Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -160,6 +160,14 @@ // ... Other methods #endregion + /// <summary> + /// Scans for PluginType's and Concrete Types that close the given open generic type + /// </summary> + /// <example> + /// + /// </example> + /// <param name="openGenericType"></param> + void ConnectImplementationsToTypesClosing(Type openGenericType); } public class AssemblyScanner : IAssemblyScanner @@ -377,6 +385,11 @@ Exclude(type => type == typeof (T)); } + public void ConnectImplementationsToTypesClosing(Type openGenericType) + { + With(new GenericConnectionScanner(openGenericType)); + } + public void AssembliesFromPath(string path) { AssembliesFromPath(path, a => true); Modified: trunk/Source/StructureMap/Graph/ITypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/ITypeScanner.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap/Graph/ITypeScanner.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -1,4 +1,5 @@ using System; +using StructureMap; namespace StructureMap.Graph { @@ -31,4 +32,28 @@ return Array.Find(interfaces, t => t.Name == interfaceName); } } + + public class GenericConnectionScanner : ITypeScanner + { + private readonly Type _openType; + + public GenericConnectionScanner(Type openType) + { + _openType = openType; + + if (!_openType.IsGeneric()) + { + throw new ApplicationException("This scanning convention can only be used with open generic types"); + } + } + + public void Process(Type type, PluginGraph graph) + { + Type interfaceType = type.FindInterfaceThatCloses(_openType); + if (interfaceType != null) + { + graph.AddType(interfaceType, type); + } + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap/ObjectFactory.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -467,5 +467,12 @@ return container.ForObject(subject); } + public static IContainer Container + { + get + { + return container; + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -5,7 +5,51 @@ namespace StructureMap.Testing.Graph { + [TestFixture] + public class GenericConnectionScannerTester + { + private Container container; + + [SetUp] + public void SetUp() + { + container = new Container(x => + { + x.Scan(o => + { + o.TheCallingAssembly(); + o.ConnectImplementationsToTypesClosing(typeof (IFinder<>)); + }); + }); + } + + [Test] + public void can_find_the_closed_finders() + { + container.GetInstance<IFinder<string>>().ShouldBeOfType<StringFinder>(); + container.GetInstance<IFinder<int>>().ShouldBeOfType<IntFinder>(); + container.GetInstance<IFinder<double>>().ShouldBeOfType<DoubleFinder>(); + } + + [Test, ExpectedException(typeof(ApplicationException))] + public void fails_on_closed_type() + { + new GenericConnectionScanner(typeof (double)); + } + } + + public interface IFinder<T> + { + + } + + public class StringFinder : IFinder<string>{} + public class IntFinder : IFinder<int>{} + public class DoubleFinder : IFinder<double>{} + + + [TestFixture] public class DefaultConventionScanningTester { [Test] Modified: trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2009-04-20 01:47:17 UTC (rev 240) +++ trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2009-05-18 21:40:09 UTC (rev 241) @@ -440,6 +440,17 @@ } [Test] + public void can_build_a_concrete_class_with_constructor_args_that_is_not_previously_registered_2() + { + var container = new Container(); + + container.With(x => + { + x.With("name").EqualTo("Jeremy"); + }).GetInstance<ConcreteThatNeedsString>().Name.ShouldEqual("Jeremy"); + } + + [Test] public void can_build_a_concrete_type_from_explicit_args_passed_into_a_named_instance() { var container = new Container(x => This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-06-03 17:47:46
|
Revision: 248 http://structuremap.svn.sourceforge.net/structuremap/?rev=248&view=rev Author: jeremydmiller Date: 2009-06-03 17:47:44 +0000 (Wed, 03 Jun 2009) Log Message: ----------- got the dispose working for nested container Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-06-03 16:21:03 UTC (rev 247) +++ trunk/Source/StructureMap/Container.cs 2009-06-03 17:47:44 UTC (rev 248) @@ -134,18 +134,8 @@ return getListOfTypeWithSession<T>(session); } - /// <summary> - /// Injects the given object into a Container as the default for the designated - /// PLUGINTYPE. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <param name="instance"></param> - public void Inject<PLUGINTYPE>(PLUGINTYPE instance) - { - _pipelineGraph.Inject(instance); - } + /// <summary> /// Creates or finds the default instance of type T /// </summary> @@ -162,20 +152,8 @@ return (T) FillDependencies(typeof (T)); } - /// <summary> - /// Injects the given object into a Container by name for the designated - /// pluginType. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="name"></param> - /// <param name="stub"></param> - public void Inject<T>(string name, T stub) - { - LiteralInstance instance = new LiteralInstance(stub).WithName(name); - _pipelineGraph.AddInstance<T>(instance); - } + /// <summary> /// Creates or resolves all registered instances of type T /// </summary> @@ -312,26 +290,8 @@ return GetInstance(type); } - /// <summary> - /// Injects the given object into a Container as the default for the designated - /// pluginType. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <param name="pluginType"></param> - /// <param name="stub"></param> - public void Inject(Type pluginType, object stub) - { - if (!CanBeCast(pluginType, stub.GetType())) - { - throw new StructureMapException(220, pluginType.FullName, - stub.GetType().FullName); - } - var instance = new LiteralInstance(stub); - _pipelineGraph.SetDefault(pluginType, instance); - } - /// <summary> /// Creates or resolves all registered instances of the pluginType /// </summary> @@ -470,7 +430,7 @@ /// <returns></returns> public IContainer GetNestedContainer() { - return new Container() + return new Container { _interceptorLibrary = _interceptorLibrary, _pipelineGraph = _pipelineGraph.Clone(), @@ -485,12 +445,17 @@ /// <returns></returns> public IContainer GetNestedContainer(string profileName) { - var container = GetNestedContainer(); + IContainer container = GetNestedContainer(); container.SetDefaultsToProfile(profileName); return container; } + public void Dispose() + { + _transientCache.DisposeAndClear(); + } + #endregion private object buildInstanceWithArgs(Type pluginType, Instance defaultInstance, ExplicitArguments args, @@ -552,16 +517,8 @@ return list; } - /// <summary> - /// Sets the default instance for the PluginType - /// </summary> - /// <param name="pluginType"></param> - /// <param name="instance"></param> - public void Inject(Type pluginType, Instance instance) - { - _pipelineGraph.SetDefault(pluginType, instance); - } + private BuildSession withNewSession(string name) { return new BuildSession(_pipelineGraph, _interceptorLibrary, _transientCache) @@ -615,5 +572,65 @@ } #endregion + + + /// <summary> + /// Injects the given object into a Container by name for the designated + /// pluginType. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="name"></param> + /// <param name="object"></param> + public void Inject<T>(string name, T @object) + { + LiteralInstance instance = new LiteralInstance(@object).WithName(name); + _transientCache.Set(typeof(T), instance, @object); + _pipelineGraph.AddInstance<T>(instance); + } + + /// <summary> + /// Sets the default instance for the PluginType + /// </summary> + /// <param name="pluginType"></param> + /// <param name="instance"></param> + public void Inject(Type pluginType, Instance instance) + { + _pipelineGraph.SetDefault(pluginType, instance); + } + + /// <summary> + /// Injects the given object into a Container as the default for the designated + /// pluginType. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <param name="pluginType"></param> + /// <param name="object"></param> + public void Inject(Type pluginType, object @object) + { + if (!CanBeCast(pluginType, @object.GetType())) + { + throw new StructureMapException(220, pluginType.FullName, + @object.GetType().FullName); + } + + + var instance = new LiteralInstance(@object); + _transientCache.Set(pluginType, instance, @object); + _pipelineGraph.SetDefault(pluginType, instance); + } + + /// <summary> + /// Injects the given object into a Container as the default for the designated + /// PLUGINTYPE. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <param name="object"></param> + public void Inject<PLUGINTYPE>(PLUGINTYPE @object) + { + var instance = _pipelineGraph.Inject(@object); + _transientCache.Set(typeof(PLUGINTYPE), instance, @object); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2009-06-03 16:21:03 UTC (rev 247) +++ trunk/Source/StructureMap/IContainer.cs 2009-06-03 17:47:44 UTC (rev 248) @@ -9,7 +9,7 @@ /// <summary> /// The main "container" object that implements the Service Locator pattern /// </summary> - public interface IContainer + public interface IContainer : IDisposable { /// <summary> /// Provides queryable access to the configured PluginType's and Instances of this Container @@ -132,8 +132,8 @@ /// to introduce mocks or stubs during automated testing scenarios /// </summary> /// <param name="pluginType"></param> - /// <param name="stub"></param> - void Inject(Type pluginType, object stub); + /// <param name="object"></param> + void Inject(Type pluginType, object @object); /// <summary> /// Injects the given object into a Container by name for the designated Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-06-03 16:21:03 UTC (rev 247) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-06-03 17:47:44 UTC (rev 248) @@ -179,11 +179,13 @@ ForType(typeof (T)).AddInstance(instance); } - public void Inject<PLUGINTYPE>(PLUGINTYPE instance) + public Instance Inject<PLUGINTYPE>(PLUGINTYPE instance) { var literalInstance = new LiteralInstance(instance); ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance); SetDefault(typeof (PLUGINTYPE), literalInstance); + + return literalInstance; } public void EjectAllInstancesOf<T>() Added: trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs 2009-06-03 17:47:44 UTC (rev 248) @@ -0,0 +1,151 @@ +using System; +using NUnit.Framework; +using StructureMap.Configuration.DSL; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] + public class ContainerDisposalTester + { + [SetUp] + public void SetUp() + { + } + + [Test] + public void disposing_a_nested_container_should_dispose_all_of_the_transient_objects_created_by_the_nested_container() + { + var container = new Container(x => + { + x.For<I1>().Use<C1Yes>(); + x.For<I2>().Use<C2Yes>(); + x.For<I3>().AddInstances(o => + { + o.OfConcreteType<C3Yes>().WithName("1"); + o.OfConcreteType<C3Yes>().WithName("2"); + }); + }); + + var child = container.GetNestedContainer(); + + var disposables = new Disposable[] + { + child.GetInstance<I1>().ShouldBeOfType<Disposable>(), + child.GetInstance<I2>().ShouldBeOfType<Disposable>(), + child.GetInstance<I3>("1").ShouldBeOfType<Disposable>(), + child.GetInstance<I3>("2").ShouldBeOfType<Disposable>(), + }; + + child.Dispose(); + + foreach (var disposable in disposables) + { + disposable.WasDisposed.ShouldBeTrue(); + } + } + + [Test] + public void disposing_a_nested_container_does_not_try_to_dispose_objects_created_by_the_parent() + { + var container = new Container(x => + { + x.ForSingletonOf<I1>().Use<C1No>(); + }); + + var child = container.GetNestedContainer(); + + // Blows up if the Dispose() is called + var notDisposable = child.GetInstance<I1>(); + + child.Dispose(); + } + + [Test] + public void should_dispose_objects_injected_into_the_container_1() + { + var container = new Container().GetNestedContainer(); + + var disposable = new C1Yes(); + container.Inject<I1>(disposable); + + container.GetInstance<I1>().ShouldBeTheSameAs(disposable); + + container.Dispose(); + + disposable.WasDisposed.ShouldBeTrue(); + } + + [Test] + public void should_dispose_objects_injected_into_the_container_2() + { + var container = new Container().GetNestedContainer(); + + var disposable = new C1Yes(); + container.Inject<I1>(disposable); + + container.Dispose(); + + disposable.WasDisposed.ShouldBeTrue(); + } + + [Test] + public void should_dispose_objects_injected_into_the_container_3() + { + var container = new Container().GetNestedContainer(); + + var disposable = new C1Yes(); + container.Inject<I1>("blue", disposable); + + container.Dispose(); + + disposable.WasDisposed.ShouldBeTrue(); + } + + + [Test] + public void should_dispose_objects_injected_into_the_container_4() + { + var container = new Container().GetNestedContainer(); + + var disposable = new C1Yes(); + container.Inject(typeof(I1), disposable); + + container.Dispose(); + + disposable.WasDisposed.ShouldBeTrue(); + } + } + + public class Disposable : IDisposable + { + private bool _wasDisposed; + + public void Dispose() + { + if (_wasDisposed) Assert.Fail("This object should not be disposed twice"); + + _wasDisposed = true; + } + + public bool WasDisposed { get { return _wasDisposed; } } + } + + public class NotDisposable : IDisposable + { + public void Dispose() + { + Assert.Fail("This object should not be disposed"); + } + } + + public interface I1{} + public interface I2{} + public interface I3{} + + public class C1Yes : Disposable, I1{} + public class C1No : NotDisposable, I1{} + public class C2Yes : Disposable, I2{} + public class C2No : Disposable, I2{} + public class C3Yes : Disposable, I3{} + public class C3No : Disposable, I3{} +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-06-03 16:21:03 UTC (rev 247) +++ trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-06-03 17:47:44 UTC (rev 248) @@ -14,6 +14,7 @@ { } + [Test] public void transient_service_in_the_parent_container_is_effectively_a_singleton_for_the_nested_container() { @@ -36,6 +37,29 @@ } [Test] + public void inject_into_the_child_does_not_affect_the_parent_container() + { + var parent = new Container(x => + { + x.For<IWidget>().Use<AWidget>(); + }); + + var child = parent.GetNestedContainer(); + var childWidget = new ColorWidget("blue"); + child.Inject<IWidget>(childWidget); + + // do the check repeatedly + child.GetInstance<IWidget>().ShouldBeTheSameAs(childWidget); + child.GetInstance<IWidget>().ShouldBeTheSameAs(childWidget); + child.GetInstance<IWidget>().ShouldBeTheSameAs(childWidget); + + + // now, compare to the parent + parent.GetInstance<IWidget>().ShouldNotBeTheSameAs(childWidget); + + } + + [Test] public void singleton_service_in_the_parent_is_found_by_the_child() { var parent = new Container(x => Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-06-03 16:21:03 UTC (rev 247) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-06-03 17:47:44 UTC (rev 248) @@ -346,6 +346,7 @@ <Compile Include="Pipeline\ConditionalInstanceTester.cs" /> <Compile Include="Pipeline\ConfiguredInstanceTester.cs" /> <Compile Include="Pipeline\ConstructorInstanceTester.cs" /> + <Compile Include="Pipeline\ContainerDisposalTester.cs" /> <Compile Include="Pipeline\ContainerIsInTheContainerTester.cs" /> <Compile Include="Pipeline\DefaultInstanceTester.cs" /> <Compile Include="Pipeline\GenericsHelperExpressionTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-06-08 15:10:13
|
Revision: 249 http://structuremap.svn.sourceforge.net/structuremap/?rev=249&view=rev Author: jeremydmiller Date: 2009-06-08 15:10:10 +0000 (Mon, 08 Jun 2009) Log Message: ----------- fixing a bug with nested containers Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-06-03 17:47:44 UTC (rev 248) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-06-08 15:10:10 UTC (rev 249) @@ -113,6 +113,16 @@ } /// <summary> + /// Shorthand to say TheDefault.Is.ConstructedBy(func) + /// </summary> + /// <param name="func"></param> + /// <returns></returns> + public ConstructorInstance<PLUGINTYPE> Use(Func<IContext, PLUGINTYPE> func) + { + return TheDefault.Is.ConstructedBy(func); + } + + /// <summary> /// Sets the object creation of the instances of the PluginType. For example: PerRequest, /// Singleton, ThreadLocal, HttpContext, or Hybrid /// </summary> Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-06-03 17:47:44 UTC (rev 248) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-06-08 15:10:10 UTC (rev 249) @@ -47,20 +47,7 @@ void SelectConstructor<T>(Expression<Func<T>> expression); } - public static class RegistryExtensions - { - public static CreatePluginFamilyExpression<PLUGINTYPE> For<PLUGINTYPE>(this IRegistry registry) - { - return registry.ForRequestedType<PLUGINTYPE>(); - } - public static GenericFamilyExpression For(this IRegistry registry, Type pluginType) - { - return registry.ForRequestedType(pluginType); - } - } - - /// <summary> /// A Registry class provides methods and grammars for configuring a Container or ObjectFactory. /// Using a Registry subclass is the recommended way of configuring a StructureMap Container. @@ -403,5 +390,25 @@ { ForRequestedType<PLUGINTYPE>().TheDefault.IsThis(instance); } + + /// <summary> + /// Shorthand for ForRequestedType<PLUGINTYPE>() + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <returns></returns> + public CreatePluginFamilyExpression<PLUGINTYPE> For<PLUGINTYPE>() + { + return ForRequestedType<PLUGINTYPE>(); + } + + /// <summary> + /// Shorthand for ForRequestedType(pluginType) + /// </summary> + /// <param name="pluginType"></param> + /// <returns></returns> + public GenericFamilyExpression For(Type pluginType) + { + return ForRequestedType(pluginType); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-06-03 17:47:44 UTC (rev 248) +++ trunk/Source/StructureMap/Container.cs 2009-06-08 15:10:10 UTC (rev 249) @@ -430,12 +430,17 @@ /// <returns></returns> public IContainer GetNestedContainer() { - return new Container + var container = new Container { _interceptorLibrary = _interceptorLibrary, _pipelineGraph = _pipelineGraph.Clone(), _transientCache = new MainObjectCache() }; + + // Fixes a mild bug. The child container should inject itself + container._pipelineGraph.Inject<IContainer>(container); + + return container; } /// <summary> Modified: trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-06-03 17:47:44 UTC (rev 248) +++ trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-06-08 15:10:10 UTC (rev 249) @@ -14,7 +14,19 @@ { } + [Test] + public void the_nested_container_delivers_itself_as_the_IContainer() + { + var parent = new Container(x => + { + x.For<IWidget>().Use<AWidget>(); + }); + var child = parent.GetNestedContainer(); + + child.GetInstance<IContainer>().ShouldBeTheSameAs(child); + } + [Test] public void transient_service_in_the_parent_container_is_effectively_a_singleton_for_the_nested_container() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-06-12 20:13:40
|
Revision: 250 http://structuremap.svn.sourceforge.net/structuremap/?rev=250&view=rev Author: jeremydmiller Date: 2009-06-12 20:13:34 +0000 (Fri, 12 Jun 2009) Log Message: ----------- fixing a small problem for Dovetail Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Pipeline/MainObjectCache.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-06-08 15:10:10 UTC (rev 249) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-06-12 20:13:34 UTC (rev 250) @@ -103,13 +103,13 @@ } /// <summary> - /// Shorthand way of saying TheDefaultIsConcreteType<> + /// Shorthand way of saying TheDefault.Is.OfConcreteType<> /// </summary> /// <typeparam name="CONCRETETYPE"></typeparam> /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> Use<CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE + public SmartInstance<CONCRETETYPE> Use<CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE { - return TheDefaultIsConcreteType<CONCRETETYPE>(); + return TheDefault.Is.OfConcreteType<CONCRETETYPE>(); } /// <summary> Modified: trunk/Source/StructureMap/Pipeline/MainObjectCache.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/MainObjectCache.cs 2009-06-08 15:10:10 UTC (rev 249) +++ trunk/Source/StructureMap/Pipeline/MainObjectCache.cs 2009-06-12 20:13:34 UTC (rev 250) @@ -26,8 +26,19 @@ public void Set(Type pluginType, Instance instance, object value) { - var key = new InstanceKey(instance, pluginType); - _objects.Add(key, value); + if (value == null) return; + + try + { + var key = new InstanceKey(instance, pluginType); + _objects.Add(key, value); + } + catch (ArgumentException e) + { + string message = string.Format("Duplicate key for Instance {0} of PluginType {1}", instance.Name, + pluginType.AssemblyQualifiedName); + throw new ArgumentException(message, e); + } } public void DisposeAndClear() @@ -36,6 +47,8 @@ { foreach (var @object in _objects.Values) { + if (@object is Container) continue; + IDisposable disposable = @object as IDisposable; if (disposable != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-07-04 17:12:21
|
Revision: 252 http://structuremap.svn.sourceforge.net/structuremap/?rev=252&view=rev Author: jeremydmiller Date: 2009-07-04 17:12:20 +0000 (Sat, 04 Jul 2009) Log Message: ----------- the redirect shortcut Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Pipeline/RedirectTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-06-26 14:34:44 UTC (rev 251) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-07-04 17:12:20 UTC (rev 252) @@ -410,5 +410,26 @@ { return ForRequestedType(pluginType); } + + + /// <summary> + /// Shortcut to make StructureMap return the default object of U casted to T + /// whenever T is requested. I.e.: + /// For<T>().TheDefault.Is.ConstructedBy(c => c.GetInstance<U>() as T); + /// </summary> + /// <typeparam name="T"></typeparam> + /// <typeparam name="U"></typeparam> + /// <returns></returns> + public ConstructorInstance<T> Redirect<T, U>() where T : class where U : class + { + return For<T>().TheDefault.Is.ConstructedBy(c => + { + var raw = c.GetInstance<U>(); + var t = raw as T; + if (t == null) throw new ApplicationException(raw.GetType().AssemblyQualifiedName + " could not be cast to " + typeof(T).AssemblyQualifiedName); + + return t; + }); + } } } \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Pipeline/RedirectTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/RedirectTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/RedirectTester.cs 2009-07-04 17:12:20 UTC (rev 252) @@ -0,0 +1,53 @@ +using System; +using NUnit.Framework; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] + public class RedirectTester + { + [Test] + public void successfully_redirect_from_one_type_to_another() + { + var container = new Container(x => + { + x.For<ITarget>().Use<ClassThatImplementsBoth>(); + x.Redirect<IOtherTarget, ITarget>(); + }); + + container.GetInstance<IOtherTarget>().ShouldBeOfType<ClassThatImplementsBoth>(); + } + + [Test, ExpectedException(typeof(StructureMapException))] + public void fail_with_cast_failure_when_the_types_are_not_convertible() + { + var container = new Container(x => + { + x.For<ITarget>().Use<ClassThatOnlyImplementsITarget>(); + x.Redirect<IOtherTarget, ITarget>(); + }); + + container.GetInstance<IOtherTarget>().ShouldBeOfType<ClassThatImplementsBoth>(); + } + } + + public interface ITarget + { + + } + + public interface IOtherTarget + { + + } + + public class ClassThatImplementsBoth : ITarget, IOtherTarget + { + + } + + public class ClassThatOnlyImplementsITarget : ITarget + { + + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-06-26 14:34:44 UTC (rev 251) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-07-04 17:12:20 UTC (rev 252) @@ -361,6 +361,7 @@ <Compile Include="Pipeline\ProfileManagerTester.cs" /> <Compile Include="Pipeline\ProfileTester.cs" /> <Compile Include="Pipeline\PrototypeInstanceTester.cs" /> + <Compile Include="Pipeline\RedirectTester.cs" /> <Compile Include="Pipeline\ReferencedInstanceTester.cs" /> <Compile Include="Pipeline\SerializedInstanceTester.cs" /> <Compile Include="Pipeline\SmartInstanceTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-07-04 17:45:17
|
Revision: 253 http://structuremap.svn.sourceforge.net/structuremap/?rev=253&view=rev Author: jeremydmiller Date: 2009-07-04 17:45:11 +0000 (Sat, 04 Jul 2009) Log Message: ----------- added the Context.All functionality Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/IContext.cs trunk/Source/StructureMap/InstanceCache.cs trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/InstanceCacheTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-07-04 17:12:20 UTC (rev 252) +++ trunk/Source/StructureMap/BuildSession.cs 2009-07-04 17:45:11 UTC (rev 253) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; @@ -111,6 +112,14 @@ return _pipelineGraph.HasInstance(typeof (T), name) ? ((IContext) this).GetInstance<T>(name) : null; } + public IEnumerable<T> All<T>() where T : class + { + var list = new List<T>(); + _cache.Each<T>(list.Add); + + return list; + } + #endregion public virtual object CreateInstance(Type pluginType, string name) Modified: trunk/Source/StructureMap/IContext.cs =================================================================== --- trunk/Source/StructureMap/IContext.cs 2009-07-04 17:12:20 UTC (rev 252) +++ trunk/Source/StructureMap/IContext.cs 2009-07-04 17:45:11 UTC (rev 253) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using StructureMap.Pipeline; namespace StructureMap @@ -63,5 +64,13 @@ /// <param name="name"></param> /// <returns></returns> T TryGetInstance<T>(string name) where T : class; + + /// <summary> + /// Gets all objects in the current object graph that can be cast + /// to T + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + IEnumerable<T> All<T>() where T : class; } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceCache.cs =================================================================== --- trunk/Source/StructureMap/InstanceCache.cs 2009-07-04 17:12:20 UTC (rev 252) +++ trunk/Source/StructureMap/InstanceCache.cs 2009-07-04 17:45:11 UTC (rev 253) @@ -61,5 +61,20 @@ } cache.Add(Instance, result); } + + public void Each<T>(Action<T> action) where T : class + { + foreach (var dictionary in _objects.Values) + { + foreach (var o in dictionary.Values) + { + T t = o as T; + if (t != null) + { + action(t); + } + } + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2009-07-04 17:12:20 UTC (rev 252) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2009-07-04 17:45:11 UTC (rev 253) @@ -5,6 +5,7 @@ using StructureMap.Pipeline; using StructureMap.Testing.Widget; using StructureMap.Testing.Widget3; +using System.Linq; namespace StructureMap.Testing { @@ -242,8 +243,46 @@ var session = new BuildSession(graph); session.GetInstance<IService>("red").ShouldBeTheSameAs(red); } + + [Test] + public void can_get_all_of_a_type_during_object_creation() + { + var container = new Container(x => + { + x.For<IWidget>().AddInstances(o => + { + o.OfConcreteType<AWidget>(); + o.ConstructedBy(() => new ColorWidget("red")); + o.ConstructedBy(() => new ColorWidget("blue")); + o.ConstructedBy(() => new ColorWidget("green")); + }); + + x.ForConcreteType<TopClass>().Configure.OnCreation((c, top) => + { + top.Widgets = c.All<IWidget>().ToArray(); + }); + }); + + container.GetInstance<TopClass>().Widgets.Count().ShouldEqual(4); + } } + public class TopClass + { + public TopClass(ClassWithWidget classWithWidget) + { + } + + public IWidget[] Widgets { get; set; } + } + + public class ClassWithWidget + { + public ClassWithWidget(IWidget[] widgets) + { + } + } + public interface IClassWithRule { } Added: trunk/Source/StructureMap.Testing/InstanceCacheTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/InstanceCacheTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/InstanceCacheTester.cs 2009-07-04 17:45:11 UTC (rev 253) @@ -0,0 +1,42 @@ +using NUnit.Framework; +using Rhino.Mocks; +using StructureMap.Pipeline; + +namespace StructureMap.Testing +{ + [TestFixture] + public class InstanceCacheTester + { + [Test] + public void call_on_each_test() + { + var target1 = MockRepository.GenerateMock<ITypeTarget>(); + var target2 = MockRepository.GenerateMock<ITypeTarget>(); + var target3 = MockRepository.GenerateMock<ITypeTarget>(); + var target4 = MockRepository.GenerateMock<ITypeTarget>(); + + var cache = new InstanceCache(); + cache.Set(typeof(int), new SmartInstance<int>(), target1); + cache.Set(typeof(int), new SmartInstance<int>(), new object()); + cache.Set(typeof(int), new SmartInstance<int>(), new object()); + cache.Set(typeof(bool), new SmartInstance<int>(), target2); + cache.Set(typeof(bool), new SmartInstance<int>(), new object()); + cache.Set(typeof(string), new SmartInstance<int>(), target3); + cache.Set(typeof(string), new SmartInstance<int>(), new object()); + cache.Set(typeof(string), new SmartInstance<int>(), new object()); + cache.Set(typeof(string), new SmartInstance<int>(), target4); + + cache.Each<ITypeTarget>(x => x.Go()); + + target1.AssertWasCalled(x => x.Go()); + target2.AssertWasCalled(x => x.Go()); + target3.AssertWasCalled(x => x.Go()); + target4.AssertWasCalled(x => x.Go()); + } + } + + public interface ITypeTarget + { + void Go(); + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-07-04 17:12:20 UTC (rev 252) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-07-04 17:45:11 UTC (rev 253) @@ -332,6 +332,7 @@ <Compile Include="Graph\TypePathTester.cs" /> <Compile Include="ImplicitPluginFromPluggedTypeAttributeTester.cs" /> <Compile Include="InstanceBuilderListTester.cs" /> + <Compile Include="InstanceCacheTester.cs" /> <Compile Include="InstanceMementoInstanceCreationTester.cs" /> <Compile Include="MementoTester.cs" /> <Compile Include="MergingTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-07-07 19:00:53
|
Revision: 254 http://structuremap.svn.sourceforge.net/structuremap/?rev=254&view=rev Author: jeremydmiller Date: 2009-07-07 19:00:49 +0000 (Tue, 07 Jul 2009) Log Message: ----------- Patching a memory leak with StructureMap Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Pipeline/Profile.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/PipelineGraph.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-07-04 17:45:11 UTC (rev 253) +++ trunk/Source/StructureMap/Container.cs 2009-07-07 19:00:49 UTC (rev 254) @@ -459,6 +459,7 @@ public void Dispose() { _transientCache.DisposeAndClear(); + _pipelineGraph.ClearAll(); } #endregion Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-07-04 17:45:11 UTC (rev 253) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-07-07 19:00:49 UTC (rev 254) @@ -170,5 +170,10 @@ { return _families.Has(pluginType); } + + public void ClearAll() + { + _families.Clear(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Profile.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Profile.cs 2009-07-04 17:45:11 UTC (rev 253) +++ trunk/Source/StructureMap/Pipeline/Profile.cs 2009-07-07 19:00:49 UTC (rev 254) @@ -110,5 +110,10 @@ { _instances.Remove(typeof (T)); } + + public void Clear() + { + _instances.Clear(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-04 17:45:11 UTC (rev 253) +++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-07 19:00:49 UTC (rev 254) @@ -245,5 +245,17 @@ pair.Value.Remove<T>(); } } + + public void ClearAll() + { + _currentProfile.Clear(); + _machineProfile.Clear(); + _default.Clear(); + + foreach (var profile in _profiles) + { + profile.Value.Clear(); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-07-04 17:45:11 UTC (rev 253) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-07-07 19:00:49 UTC (rev 254) @@ -231,5 +231,12 @@ { return ForType(pluginType).FindInstance(instanceKey) != null; } + + public void ClearAll() + { + _factories.Clear(); + _profileManager.ClearAll(); + _genericsGraph.ClearAll(); + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-07-14 15:03:20
|
Revision: 255 http://structuremap.svn.sourceforge.net/structuremap/?rev=255&view=rev Author: jeremydmiller Date: 2009-07-14 15:03:08 +0000 (Tue, 14 Jul 2009) Log Message: ----------- memory lead fixes Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/LiteralInstance.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/Container.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -459,7 +459,7 @@ public void Dispose() { _transientCache.DisposeAndClear(); - _pipelineGraph.ClearAll(); + _pipelineGraph.Dispose(); } #endregion Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -9,7 +9,7 @@ /// <summary> /// Interface for a "Factory" pattern class that creates object instances of the PluginType /// </summary> - public interface IInstanceFactory + public interface IInstanceFactory : IDisposable { Type PluginType { get; } @@ -27,7 +27,7 @@ Instance FindInstance(string name); void ImportFrom(PluginFamily family); - [Obsolete("Kill!!!!")] + void EjectAllInstances(); ILifecycle Lifecycle {get; } Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -146,5 +146,10 @@ } #endregion + + public void Dispose() + { + _instances.Clear(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/LiteralInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -3,9 +3,9 @@ namespace StructureMap.Pipeline { - public class LiteralInstance : ExpressedInstance<LiteralInstance> + public class LiteralInstance : ExpressedInstance<LiteralInstance>, IDisposable { - private readonly object _object; + private object _object; public LiteralInstance(object anObject) { @@ -48,5 +48,10 @@ { return string.Format("LiteralInstance: {0}", _object); } + + public void Dispose() + { + _object = null; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -5,7 +5,7 @@ namespace StructureMap.Pipeline { - public class ProfileManager + public class ProfileManager : IDisposable { private readonly Profile _default = new Profile(""); private readonly object _locker = new object(); @@ -246,7 +246,7 @@ } } - public void ClearAll() + public void Dispose() { _currentProfile.Clear(); _machineProfile.Clear(); Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -10,7 +10,7 @@ public delegate InstanceFactory MissingFactoryFunction(Type pluginType, ProfileManager profileManager); - public class PipelineGraph + public class PipelineGraph : IDisposable { private readonly Dictionary<Type, IInstanceFactory> _factories = new Dictionary<Type, IInstanceFactory>(); @@ -54,11 +54,15 @@ _missingFactory = _missingFactory }; + + foreach (var pair in _factories) { - clone._factories.Add(pair.Key, pair.Value); + clone._factories.Add(pair.Key, pair.Value.Clone()); } + clone.EjectAllInstancesOf<IContainer>(); + return clone; } @@ -232,10 +236,26 @@ return ForType(pluginType).FindInstance(instanceKey) != null; } - public void ClearAll() + public void Dispose() { + if (_factories.ContainsKey(typeof(IContainer))) + { + foreach (var instance in _factories[typeof(IContainer)].AllInstances) + { + IDisposable disposable = instance as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + } + + foreach (var factory in _factories) + { + factory.Value.Dispose(); + } _factories.Clear(); - _profileManager.ClearAll(); + _profileManager.Dispose(); _genericsGraph.ClearAll(); } } Modified: trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-07-07 19:00:49 UTC (rev 254) +++ trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-07-14 15:03:08 UTC (rev 255) @@ -28,6 +28,33 @@ } [Test] + public void disposing_the_child_container_does_not_affect_the_parent_container() + { + var container = new Container(x => + { + x.Scan(o => + { + o.TheCallingAssembly(); + o.AddAllTypesOf<IBar>(); + }); + }); + + container.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0); + + using (var nested = container.GetNestedContainer()) + { + nested.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0); + } + + container.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0); + } + + public interface IBar{} + public class AFoo : IBar{} + public class BFoo : IBar{} + public class CFoo : IBar{} + + [Test] public void transient_service_in_the_parent_container_is_effectively_a_singleton_for_the_nested_container() { var parent = new Container(x => This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-08-12 15:29:40
|
Revision: 256 http://structuremap.svn.sourceforge.net/structuremap/?rev=256&view=rev Author: jeremydmiller Date: 2009-08-12 15:29:30 +0000 (Wed, 12 Aug 2009) Log Message: ----------- added the Forward to functionality Modified Paths: -------------- trunk/Source/StructureMap/Attributes/PluggableAttribute.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Model.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Debugging.cs trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs Modified: trunk/Source/StructureMap/Attributes/PluggableAttribute.cs =================================================================== --- trunk/Source/StructureMap/Attributes/PluggableAttribute.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/Attributes/PluggableAttribute.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -20,23 +20,13 @@ public string ConcreteKey { get; set; } /// <summary> - /// Gets an instance of PluggableAttribute from a Type object - /// </summary> - /// <param name="objectType"></param> - /// <returns></returns> - public static PluggableAttribute InstanceOf(Type objectType) - { - return GetCustomAttribute(objectType, typeof (PluggableAttribute), false) as PluggableAttribute; - } - - /// <summary> /// Determines whether a Type object is marked as Pluggable /// </summary> /// <param name="objectType"></param> /// <returns></returns> public static bool MarkedAsPluggable(Type objectType) { - PluggableAttribute att = InstanceOf(objectType); + PluggableAttribute att = GetCustomAttribute(objectType, typeof (PluggableAttribute), false) as PluggableAttribute; return (att != null); } } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -180,7 +180,7 @@ ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration); } - public class InstanceExpression<T> : IInstanceExpression<T>, ThenItExpression<T> + public class InstanceExpression<T> : IInstanceExpression<T>, ThenItExpression<T> { private readonly Action<Instance> _action; @@ -274,6 +274,7 @@ return returnInstance(new ConditionalInstance<T>(configuration)); } + IsExpression<T> ThenItExpression<T>.ThenIt { get { return this; } Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -45,6 +45,15 @@ /// <typeparam name="T"></typeparam> /// <param name="expression"></param> void SelectConstructor<T>(Expression<Func<T>> expression); + + /// <summary> + /// Use to "forward" the request for FROM to the default of TO + /// Useful for singleton services that implement multiple + /// interface roles + /// </summary> + /// <typeparam name="FROM"></typeparam> + /// <typeparam name="TO"></typeparam> + void Forward<FROM, TO>() where FROM : class where TO : class; } @@ -370,7 +379,12 @@ PluginCache.GetPlugin(typeof(T)).UseConstructor(expression); } + public void Forward<FROM, TO>() where FROM : class where TO : class + { + For<FROM>().Use(c => c.GetInstance<TO>() as FROM); + } + /// <summary> /// Syntactic Sugar for saying ForRequestedType().TheDefault.IsThis( @object ) /// </summary> Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -29,7 +29,8 @@ public Plugin(Type pluggedType) { - PluggableAttribute att = PluggableAttribute.InstanceOf(pluggedType); + PluggableAttribute att = + Attribute.GetCustomAttribute(pluggedType, typeof (PluggableAttribute), false) as PluggableAttribute; _concreteKey = att == null ? pluggedType.AssemblyQualifiedName : att.ConcreteKey; _pluggedType = pluggedType; Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -108,7 +108,7 @@ { _lifecycle = family.Lifecycle; } - else if (!_lifecycle.GetType().Equals(family.Lifecycle.GetType())) + else if (_lifecycle != null && family.Lifecycle != null && !_lifecycle.GetType().Equals(family.Lifecycle.GetType())) { // TODO: Might need to clear out the existing policy when it's ejected _lifecycle = family.Lifecycle; Modified: trunk/Source/StructureMap/Model.cs =================================================================== --- trunk/Source/StructureMap/Model.cs 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap/Model.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -17,6 +17,8 @@ /// </summary> IEnumerable<PluginTypeConfiguration> PluginTypes { get; } + IEnumerable<IInstance> AllInstances { get; } + /// <summary> /// Can StructureMap fulfill a request to ObjectFactory.GetInstance(pluginType) from the /// current configuration. This does not include concrete classes that could be auto-configured @@ -109,6 +111,20 @@ return HasImplementationsFor(typeof (T)); } + public IEnumerable<IInstance> AllInstances + { + get + { + foreach (var pluginType in PluginTypes) + { + foreach (IInstance instance in pluginType.Instances) + { + yield return instance; + } + } + } + } + #endregion } } \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Debugging.cs =================================================================== --- trunk/Source/StructureMap.Testing/Debugging.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Debugging.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -0,0 +1,18 @@ +using NUnit.Framework; +using StructureMap.Testing.Widget; + +namespace StructureMap.Testing +{ + [TestFixture, Explicit] + public class Debugging + { + [SetUp] + public void SetUp() + { + } + + + } + + +} \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs 2009-08-12 15:29:30 UTC (rev 256) @@ -0,0 +1,36 @@ +using NUnit.Framework; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] + public class RedirectingTester + { + [Test] + public void can_successfully_redirect() + { + var container = new Container(x => + { + x.For<IOne>().Use<OneAndTwo>(); + x.Forward<ITwo, IOne>(); + }); + + container.GetInstance<IOne>().ShouldBeOfType<OneAndTwo>(); + + } + } + + public interface IOne + { + + } + + public interface ITwo + { + + } + + public class OneAndTwo : IOne, ITwo + { + + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-07-14 15:03:08 UTC (rev 255) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-08-12 15:29:30 UTC (rev 256) @@ -220,6 +220,7 @@ <Compile Include="Configuration\PrimitiveArrayReaderTester.cs" /> <Compile Include="Configuration\ProfileBuilderTester.cs" /> <Compile Include="Configuration\ShortcuttedInstanceNodeTester.cs" /> + <Compile Include="Debugging.cs" /> <Compile Include="Diagnostics\DoctorTester.cs" /> <Compile Include="Diagnostics\WriterExtensions.cs" /> <Compile Include="Examples.cs"> @@ -362,6 +363,7 @@ <Compile Include="Pipeline\ProfileManagerTester.cs" /> <Compile Include="Pipeline\ProfileTester.cs" /> <Compile Include="Pipeline\PrototypeInstanceTester.cs" /> + <Compile Include="Pipeline\RedirectingTester.cs" /> <Compile Include="Pipeline\RedirectTester.cs" /> <Compile Include="Pipeline\ReferencedInstanceTester.cs" /> <Compile Include="Pipeline\SerializedInstanceTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-08-12 15:38:11
|
Revision: 257 http://structuremap.svn.sourceforge.net/structuremap/?rev=257&view=rev Author: jeremydmiller Date: 2009-08-12 15:38:03 +0000 (Wed, 12 Aug 2009) Log Message: ----------- changed "forward" Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-08-12 15:29:30 UTC (rev 256) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-08-12 15:38:03 UTC (rev 257) @@ -381,7 +381,7 @@ public void Forward<FROM, TO>() where FROM : class where TO : class { - For<FROM>().Use(c => c.GetInstance<TO>() as FROM); + For<TO>().AddInstances(x => x.ConstructedBy(c => c.GetInstance<FROM>() as TO)); } Modified: trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs 2009-08-12 15:29:30 UTC (rev 256) +++ trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs 2009-08-12 15:38:03 UTC (rev 257) @@ -11,7 +11,7 @@ var container = new Container(x => { x.For<IOne>().Use<OneAndTwo>(); - x.Forward<ITwo, IOne>(); + x.Forward<IOne, ITwo>(); }); container.GetInstance<IOne>().ShouldBeOfType<OneAndTwo>(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-08-21 15:58:50
|
Revision: 258 http://structuremap.svn.sourceforge.net/structuremap/?rev=258&view=rev Author: jeremydmiller Date: 2009-08-21 15:58:38 +0000 (Fri, 21 Aug 2009) Log Message: ----------- took in a patch on AssemblyScanner. Added a couple convenience methods Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-08-12 15:38:03 UTC (rev 257) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-08-21 15:58:38 UTC (rev 258) @@ -123,6 +123,16 @@ } /// <summary> + /// Shorthand to say TheDefault.IsThis(@object) + /// </summary> + /// <param name="object"></param> + /// <returns></returns> + public LiteralInstance Use(PLUGINTYPE @object) + { + return TheDefault.IsThis(@object); + } + + /// <summary> /// Sets the object creation of the instances of the PluginType. For example: PerRequest, /// Singleton, ThreadLocal, HttpContext, or Hybrid /// </summary> Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-08-12 15:38:03 UTC (rev 257) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-08-21 15:58:38 UTC (rev 258) @@ -43,13 +43,18 @@ public ConfiguredInstance TheDefaultIsConcreteType(Type concreteType) { var instance = new ConfiguredInstance(concreteType); + Use(instance); + + return instance; + } + + public void Use(Instance instance) + { alterAndContinue(family => { family.AddInstance(instance); family.DefaultInstanceKey = instance.Name; }); - - return instance; } /// <summary> @@ -61,6 +66,7 @@ { return TheDefaultIsConcreteType(concreteType); } + /// <summary> /// Shortcut method to add an additional Instance to this Plugin Type Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-08-12 15:38:03 UTC (rev 257) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-08-21 15:58:38 UTC (rev 258) @@ -3,7 +3,6 @@ using System.Diagnostics; using System.Linq; using System.Reflection; -using System.Threading; namespace StructureMap.Graph { @@ -56,6 +55,19 @@ /// <param name="assemblyFilter"></param> void AssembliesFromPath(string path, Predicate<Assembly> assemblyFilter); + /// <summary> + /// Sweep the application base directory of current app domain and add any Assembly's + /// found to the scanning operation. + /// </summary> + void AssembliesFromApplicationBaseDirectory(); + + /// <summary> + /// Sweep the application base directory of current app domain and add any Assembly's + /// found to the scanning operation. The assemblyFilter can be used to filter or limit the + /// Assembly's that are picked up. + /// </summary> + void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter); + #endregion // ... Other methods @@ -390,6 +402,20 @@ With(new GenericConnectionScanner(openGenericType)); } + public void AssembliesFromApplicationBaseDirectory() + { + var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; + + AssembliesFromPath(baseDirectory, a => true); + } + + public void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter) + { + var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; + + AssembliesFromPath(baseDirectory, assemblyFilter); + } + public void AssembliesFromPath(string path) { AssembliesFromPath(path, a => true); @@ -418,4 +444,4 @@ } } } -} \ No newline at end of file +} Modified: trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs 2009-08-12 15:38:03 UTC (rev 257) +++ trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs 2009-08-21 15:58:38 UTC (rev 258) @@ -152,6 +152,25 @@ } [Test] + public void scan_all_assemblies_in_application_base_directory() + { + Scan(x => x.AssembliesFromApplicationBaseDirectory()); + shouldHaveFamilyWithSameName<IInterfaceInWidget5>(); + shouldHaveFamilyWithSameName<Widget3.IWorker>(); + } + + [Test] + public void scan_specific_assemblies_in_application_base_directory() + { + var assemblyToSpecificallyExclude = typeof(Widget3.IWorker).Assembly.GetName().Name; + Scan(x => x.AssembliesFromPath(assemblyScanningFolder, asm => asm.GetName().Name != assemblyToSpecificallyExclude)); + + shouldHaveFamilyWithSameName<IInterfaceInWidget5>(); + shouldNotHaveFamilyWithSameName<Widget3.IWorker>(); + } + + + [Test] public void scan_specific_assemblies_in_a_folder() { var assemblyToSpecificallyExclude = typeof(Widget3.IWorker).Assembly.GetName().Name; @@ -385,4 +404,4 @@ } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-09-16 00:06:37
|
Revision: 262 http://structuremap.svn.sourceforge.net/structuremap/?rev=262&view=rev Author: jeremydmiller Date: 2009-09-16 00:06:24 +0000 (Wed, 16 Sep 2009) Log Message: ----------- changing the concrete class behavior so that it can still build a concrete class that is not specified, but it doesn't get into the GetAllInstances() Modified Paths: -------------- trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/ConcreteClassCreationTester.cs Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; using System.Reflection; @@ -404,9 +405,7 @@ public void AssembliesFromApplicationBaseDirectory() { - var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; - - AssembliesFromPath(baseDirectory, a => true); + AssembliesFromApplicationBaseDirectory(a => true); } public void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter) @@ -414,6 +413,13 @@ var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; AssembliesFromPath(baseDirectory, assemblyFilter); + var binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath; + if (Directory.Exists(binPath)) + { + AssembliesFromPath(binPath, assemblyFilter); + } + + } public void AssembliesFromPath(string path) Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -33,14 +33,14 @@ PluginFamilyAttribute.ConfigureFamily(this); - if (IsConcrete(pluginType)) - { - Plugin plugin = PluginCache.GetPlugin(pluginType); - if (plugin.CanBeCreated()) - { - AddPlugin(pluginType, Plugin.DEFAULT); - } - } + //if (IsConcrete(pluginType)) + //{ + // Plugin plugin = PluginCache.GetPlugin(pluginType); + // if (plugin.CanBeCreated()) + // { + // AddPlugin(pluginType, Plugin.DEFAULT); + // } + //} } public void SetScopeTo(ILifecycle lifecycle) @@ -109,6 +109,12 @@ validatePluggabilityOfInstances(); + if (_pluginType.IsConcrete() && PluginCache.GetPlugin(_pluginType).CanBeAutoFilled) + { + MissingInstance = new ConfiguredInstance(_pluginType); + } + + if (_instances.Count == 1) { _defaultKey = _instances.First.Name; @@ -136,11 +142,12 @@ { _pluggedTypes.Each((key, plugin) => { - if (plugin.CanBeAutoFilled && !hasInstanceWithPluggedType(plugin)) - { - ConfiguredInstance instance = new ConfiguredInstance(plugin.PluggedType).WithName(key); - AddInstance(instance); - } + if (!plugin.CanBeAutoFilled) return; + + if (hasInstanceWithPluggedType(plugin)) return; + + ConfiguredInstance instance = new ConfiguredInstance(plugin.PluggedType).WithName(key); + AddInstance(instance); }); } Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -167,7 +167,7 @@ { // Need to ensure that the factory exists first createFactoryIfMissing(pluginType); - return _profileManager.GetDefault(pluginType); + return _profileManager.GetDefault(pluginType) ?? _factories[pluginType].MissingInstance; } public void SetDefault(Type pluginType, Instance instance) Added: trunk/Source/StructureMap.Testing/ConcreteClassCreationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ConcreteClassCreationTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/ConcreteClassCreationTester.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -0,0 +1,44 @@ +using NUnit.Framework; +using StructureMap.Testing.Widget; + +namespace StructureMap.Testing +{ + [TestFixture] + public class ConcreteClassCreationTester + { + private Container container; + + [SetUp] + public void SetUp() + { + container = new Container(x => + { + x.For<IWidget>().Use(new ColorWidget("red")); + }); + } + + [Test] + public void can_create_a_concrete_class_by_default() + { + container.GetInstance<ConcreteClass>().Widget1.ShouldBeOfType<ColorWidget>(); + } + + [Test] + public void the_instance_count_is_zero() + { + container.GetAllInstances<ConcreteClass>().Count.ShouldEqual(0); + } + + public class ConcreteClass + { + private readonly IWidget _widget; + + public ConcreteClass(IWidget widget) + { + _widget = widget; + } + + public IWidget Widget1 { get { return _widget; } } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -146,7 +146,7 @@ { ValidationBuildSession session = validatedSession( - registry => registry.BuildInstancesOf<SomethingThatHasValidationFailures>()); + registry => registry.BuildInstancesOf<SomethingThatHasValidationFailures>().TheDefaultIsConcreteType<SomethingThatHasValidationFailures>()); Assert.AreEqual(2, session.ValidationErrors.Length); } Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -126,20 +126,6 @@ } [Test] - public void Create_PluginFamily_for_concrete_type_that_can_be_autofilled_and_create_default_instance() - { - var family = new PluginFamily(GetType()); - family.Seal(); - - Assert.AreEqual(Plugin.DEFAULT, family.DefaultInstanceKey); - Assert.AreEqual(1, family.PluginCount); - Assert.AreEqual(1, family.InstanceCount); - var instance = (IConfiguredInstance) family.FirstInstance(); - Assert.AreEqual(Plugin.DEFAULT, instance.Name); - Assert.AreEqual(GetType(), instance.PluggedType); - } - - [Test] public void FillDefault_happy_path() { var family = new PluginFamily(typeof (IWidget)); @@ -178,14 +164,6 @@ } [Test] - public void If_PluginType_is_concrete_automatically_add_a_plugin_called_default() - { - var family = new PluginFamily(GetType()); - family.PluginCount.ShouldEqual(1); - family.FindPlugin(Plugin.DEFAULT).PluggedType.ShouldEqual(GetType()); - } - - [Test] public void ImplicitPluginFamilyCreatesASingletonInterceptorWhenIsSingletonIsTrue() { var family = new PluginFamily(typeof (ISingletonRepository)); Modified: trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs 2009-09-16 00:06:24 UTC (rev 262) @@ -12,7 +12,7 @@ [SetUp] public void SetUp() { - _manager = new Container(registry => + container = new Container(registry => { registry.BuildInstancesOf<INormalType>(); registry.Scan(x => @@ -26,7 +26,7 @@ #endregion - private IContainer _manager; + private IContainer container; [Test] public void DoNotFindPluginWithNoPublicCTOR() @@ -38,19 +38,19 @@ [Test] public void FoundTheRightNumberOfInstancesForATypeWithNoPlugins() { - Assert.AreEqual(3, _manager.GetAllInstances<TypeIWantToFind>().Count); + Assert.AreEqual(3, container.GetAllInstances<TypeIWantToFind>().Count); } [Test] public void FoundTheRightNumberOfInstancesForATypeWithNoPlugins2() { - Assert.AreEqual(2, _manager.GetAllInstances<OtherType>().Count); + container.GetAllInstances<OtherType>().Count.ShouldEqual(2); } [Test] public void ScanAssembliesForAPluginAndOnlyGetExplicitlyAttributedClassesWithPluginAttributes() { - IList<INormalType> instances = _manager.GetAllInstances<INormalType>(); + IList<INormalType> instances = container.GetAllInstances<INormalType>(); Assert.AreEqual(1, instances.Count); Assert.IsInstanceOfType(typeof (NormalTypeWithPluggableAttribute), instances[0]); Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-09-13 14:12:42 UTC (rev 261) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-09-16 00:06:24 UTC (rev 262) @@ -189,6 +189,7 @@ <Compile Include="BuildSessionTester.cs" /> <Compile Include="BuildUpIntegratedTester.cs" /> <Compile Include="BuildUpTester.cs" /> + <Compile Include="ConcreteClassCreationTester.cs" /> <Compile Include="Configuration\ConfigurationParserBuilderTester.cs" /> <Compile Include="Configuration\ConfigurationParserTester.cs" /> <Compile Include="Configuration\DefaultInstanceNodeTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fli...@us...> - 2009-09-28 02:01:49
|
Revision: 263 http://structuremap.svn.sourceforge.net/structuremap/?rev=263&view=rev Author: flimflan Date: 2009-09-28 02:01:41 +0000 (Mon, 28 Sep 2009) Log Message: ----------- Fixed bug with TryGetInstance not returning instances for registered open generic types. Modified Paths: -------------- trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-09-16 00:06:24 UTC (rev 262) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-09-28 02:01:41 UTC (rev 263) @@ -227,7 +227,9 @@ public bool HasDefaultForPluginType(Type pluginType) { - PluginTypeConfiguration configuration = PluginTypes.FirstOrDefault(p => p.PluginType == pluginType); + var typeToFind = pluginType.IsGenericType ? pluginType.GetGenericTypeDefinition() : pluginType; + var configuration = PluginTypes.FirstOrDefault(p => p.PluginType == typeToFind); + return configuration == null ? false : configuration.Default != null; } Modified: trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2009-09-16 00:06:24 UTC (rev 262) +++ trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2009-09-28 02:01:41 UTC (rev 263) @@ -272,8 +272,21 @@ instance.ShouldBeOfType(typeof(ColorRule)); } + [Test] + public void TryGetInstance_returns_instance_for_an_open_generic_that_it_can_close() + { + var container = new Container(x => x.ForRequestedType(typeof (IOpenGeneric<>)).TheDefaultIsConcreteType(typeof (ConcreteOpenGeneric<>))); + container.TryGetInstance<IOpenGeneric<object>>().ShouldNotBeNull(); + } + [Test] + public void TryGetInstance_returns_null_for_an_open_generic_that_it_cannot_close() + { + var container = new Container(x => x.ForRequestedType(typeof(IOpenGeneric<>)).TheDefaultIsConcreteType(typeof(ConcreteOpenGeneric<>))); + container.TryGetInstance<IAnotherOpenGeneric<object>>().ShouldBeNull(); + } + [Test, ExpectedException(typeof (StructureMapException))] public void GetMissingType() { @@ -303,4 +316,8 @@ manager.GetInstance<IService>(); } } + + public interface IOpenGeneric<T>{} + public interface IAnotherOpenGeneric<T>{} + public class ConcreteOpenGeneric<T> : IOpenGeneric<T>{} } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-10-06 13:51:43
|
Revision: 264 http://structuremap.svn.sourceforge.net/structuremap/?rev=264&view=rev Author: jeremydmiller Date: 2009-10-06 13:51:35 +0000 (Tue, 06 Oct 2009) Log Message: ----------- Fixing the validation session problem Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-09-28 02:01:41 UTC (rev 263) +++ trunk/Source/StructureMap/BuildSession.cs 2009-10-06 13:51:35 UTC (rev 264) @@ -9,7 +9,7 @@ { public class BuildSession : IContext { - private BuildStack _buildStack = new BuildStack(); + protected BuildStack _buildStack = new BuildStack(); private readonly InstanceCache _cache = new InstanceCache(); private readonly Cache<Type, Func<object>> _defaults; private readonly PipelineGraph _pipelineGraph; Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-09-28 02:01:41 UTC (rev 263) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-10-06 13:51:35 UTC (rev 264) @@ -115,6 +115,7 @@ { foreach (Instance instance in pluginType.Instances) { + _buildStack = new BuildStack(); validateInstance(pluginType.PluginType, instance); } } Modified: trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-09-28 02:01:41 UTC (rev 263) +++ trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-10-06 13:51:35 UTC (rev 264) @@ -4,6 +4,7 @@ using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.Configuration.DSL; using StructureMap.Testing.Widget; namespace StructureMap.Testing.Diagnostics @@ -57,6 +58,28 @@ } [Test] + public void do_not_fail_with_the_bidirectional_checks() + { + var container = new Container(r => + { + r.For<IWidget>().Use<ColorWidget>().WithCtorArg("color").EqualTo("red"); + r.For<Rule>().Use<WidgetRule>(); + + r.ForConcreteType<ClassThatNeedsWidgetAndRule1>(); + r.ForConcreteType<ClassThatNeedsWidgetAndRule2>(); + r.InstanceOf<ClassThatNeedsWidgetAndRule2>().Is.OfConcreteType<ClassThatNeedsWidgetAndRule2>(); + r.InstanceOf<ClassThatNeedsWidgetAndRule2>().Is.OfConcreteType<ClassThatNeedsWidgetAndRule2>(); + r.InstanceOf<ClassThatNeedsWidgetAndRule2>().Is.OfConcreteType<ClassThatNeedsWidgetAndRule2>(); + r.InstanceOf<ClassThatNeedsWidgetAndRule2>().Is.OfConcreteType<ClassThatNeedsWidgetAndRule2>().CtorDependency<Rule>().Is<ARule>(); + + + }); + + container.AssertConfigurationIsValid(); + } + + + [Test] public void Create_an_instance_for_the_first_time_happy_path() { ValidationBuildSession session = @@ -170,6 +193,20 @@ } } + public class ClassThatNeedsWidgetAndRule1 + { + public ClassThatNeedsWidgetAndRule1(IWidget widget, Rule rule) + { + } + } + + public class ClassThatNeedsWidgetAndRule2 + { + public ClassThatNeedsWidgetAndRule2(IWidget widget, Rule rule, ClassThatNeedsWidgetAndRule1 class1) + { + } + } + public class WidgetWithOneValidationFailure : IWidget { #region IWidget Members This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-10-07 16:34:31
|
Revision: 265 http://structuremap.svn.sourceforge.net/structuremap/?rev=265&view=rev Author: andreas_ohlund Date: 2009-10-07 16:34:20 +0000 (Wed, 07 Oct 2009) Log Message: ----------- Fixed bug where static properties caused JITExceptions Modified Paths: -------------- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-10-06 13:51:35 UTC (rev 264) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-10-07 16:34:20 UTC (rev 265) @@ -18,8 +18,7 @@ _properties = new List<SetterProperty>(); _plugin = plugin; - - foreach (PropertyInfo property in plugin.PluggedType.GetProperties()) + foreach (PropertyInfo property in plugin.PluggedType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (property.CanWrite && property.GetSetMethod(false) != null) { Modified: trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs 2009-10-06 13:51:35 UTC (rev 264) +++ trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs 2009-10-07 16:34:20 UTC (rev 265) @@ -98,6 +98,7 @@ }); } + [Test] public void specify_an_array_as_a_constructor() { @@ -134,6 +135,16 @@ { build<ColorRule>(i => i.WithCtorArg("color").EqualTo("Red")).Color.ShouldEqual("Red"); } + + [Test] + public void specifying_double_property_should_handle_locale() + { + var container = new Container(x => x.ForRequestedType<ClassWithDoubleProperty>() + .TheDefault.Is.OfConcreteType<ClassWithDoubleProperty>() + .WithProperty(o=>o.Double).EqualTo("4,5")); + + Assert.AreEqual(4.5, container.GetInstance<ClassWithDoubleProperty>().Double); + } } public class ClassWithWidgetArrayCtor @@ -151,6 +162,11 @@ } } + public class ClassWithDoubleProperty + { + public double Double { get; set; } + } + public class ClassWithWidgetArraySetter { public IWidget[] Widgets { get; set; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |