From: <jer...@us...> - 2009-12-28 01:17:27
|
Revision: 306 http://structuremap.svn.sourceforge.net/structuremap/?rev=306&view=rev Author: jeremydmiller Date: 2009-12-28 01:17:17 +0000 (Mon, 28 Dec 2009) Log Message: ----------- The big "Model" overhaul Modified Paths: -------------- trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs 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/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/IPluginFamily.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/ILifecycle.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/Lifecycles.cs trunk/Source/StructureMap/Pipeline/ObjectBuilder.cs trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/Query/IModel.cs trunk/Source/StructureMap/Query/Model.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/SystemRegistry.cs trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs trunk/Source/StructureMap.Testing/Bugs/HttpSessionNullRefBug.cs trunk/Source/StructureMap.Testing/Bugs/SingletonShouldBeLazy.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeOnOpenGenericsTester.cs trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs trunk/Source/StructureMap.Testing/Examples.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs trunk/Source/StructureMap.Testing/Graph/FullStackFacadeTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildLifecycleTester.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStorageLifecycleTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing.GenericWidgets/Widgets.cs Added Paths: ----------- trunk/Source/StructureMap/InstanceScope.cs trunk/Source/StructureMap/Pipeline/HybridLifecycle.cs trunk/Source/StructureMap/Query/EmptyConfiguration.cs trunk/Source/StructureMap/Query/GenericFamilyConfiguration.cs trunk/Source/StructureMap/Query/IFamily.cs trunk/Source/StructureMap/Query/IPluginTypeConfiguration.cs trunk/Source/StructureMap/Query/InstanceFactoryTypeConfiguration.cs trunk/Source/StructureMap/Query/InstanceRef.cs trunk/Source/StructureMap.Testing/Query/ trunk/Source/StructureMap.Testing/Query/GenericFamilyConfigurationTester.cs trunk/Source/StructureMap.Testing/Query/InstanceFactoryTypeConfigurationTester.cs trunk/Source/StructureMap.Testing/Query/InstanceRefTester.cs trunk/Source/StructureMap.Testing/Query/ModelIntegrationTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Attributes/InstanceScope.cs trunk/Source/StructureMap/PluginTypeConfiguration.cs trunk/Source/StructureMap.Testing/PipelineGraphTester.cs Deleted: trunk/Source/StructureMap/Attributes/InstanceScope.cs =================================================================== --- trunk/Source/StructureMap/Attributes/InstanceScope.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Attributes/InstanceScope.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,13 +0,0 @@ -namespace StructureMap.Attributes -{ - public enum InstanceScope - { - PerRequest, - Singleton, - ThreadLocal, - HttpContext, - Hybrid, - HttpSession, - HybridHttpSession - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs =================================================================== --- trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,5 +1,4 @@ using System; -using StructureMap.Attributes; using StructureMap.Graph; namespace StructureMap Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/BuildSession.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -16,9 +16,9 @@ private readonly PipelineGraph _pipelineGraph; protected BuildStack _buildStack = new BuildStack(); - public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary, IObjectCache cache) + public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary) { - _builder = new ObjectBuilder(pipelineGraph, interceptorLibrary, cache); + _builder = new ObjectBuilder(pipelineGraph, interceptorLibrary); _pipelineGraph = pipelineGraph; _defaults = new Cache<Type, Func<object>>(t => @@ -35,7 +35,7 @@ } public BuildSession(PluginGraph graph) - : this(new PipelineGraph(graph), graph.InterceptorLibrary, new NulloObjectCache()) + : this(new PipelineGraph(graph), graph.InterceptorLibrary) { } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using StructureMap.Attributes; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; @@ -358,5 +357,18 @@ { return LifecycleIs(new UniquePerRequestLifecycle()); } + + /// <summary> + /// Adds the object to to the PLUGINTYPE + /// </summary> + /// <param name="object"></param> + /// <returns></returns> + public ObjectInstance Add(PLUGINTYPE @object) + { + var instance = new ObjectInstance(@object); + _alterations.Add(f => f.AddInstance(instance)); + + return instance; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,5 +1,4 @@ using System; -using StructureMap.Attributes; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -103,7 +103,7 @@ /// </summary> /// <typeparam name="PLUGGEDTYPE"></typeparam> /// <returns></returns> - [Obsolete("Favor For<ISomething>().Use<Something>()")] + [Obsolete("Favor For<ISomething>().Use<Something>() or For<ISomething>().Add<Something>()")] SmartInstance<PLUGGEDTYPE> OfConcreteType<PLUGGEDTYPE>() where PLUGGEDTYPE : T; /// <summary> Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,6 +1,5 @@ using System; using System.Xml; -using StructureMap.Attributes; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Source; Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Container.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -18,7 +18,6 @@ private InterceptorLibrary _interceptorLibrary; private PipelineGraph _pipelineGraph; private PluginGraph _pluginGraph; - private IObjectCache _transientCache = new NulloObjectCache(); public Container(Action<ConfigurationExpression> action) { @@ -65,7 +64,7 @@ /// <summary> /// Provides queryable access to the configured PluginType's and Instances of this Container /// </summary> - public IModel Model { get { return new Model(_pipelineGraph, this); } } + public IModel Model { get { return new Model(_pipelineGraph.GetPluginTypes(this)); } } /// <summary> /// Creates or finds the named instance of T @@ -442,8 +441,7 @@ var container = new Container { _interceptorLibrary = _interceptorLibrary, - _pipelineGraph = _pipelineGraph.Clone(), - _transientCache = new MainObjectCache() + _pipelineGraph = _pipelineGraph.ToNestedGraph(), }; // Fixes a mild bug. The child container should inject itself @@ -467,61 +465,12 @@ public void Dispose() { - _transientCache.DisposeAndClear(); _pipelineGraph.Dispose(); } #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) - { - ObjectInstance instance = new ObjectInstance(@object).WithName(name); - _transientCache.Set(typeof (T), instance, @object); - _pipelineGraph.AddInstance<T>(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 (!@object.GetType().CanBeCastTo(pluginType)) - { - throw new StructureMapException(220, pluginType.FullName, - @object.GetType().FullName); - } - - - var instance = new ObjectInstance(@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) - { - Instance instance = _pipelineGraph.Inject(@object); - _transientCache.Set(typeof (PLUGINTYPE), instance, @object); - } - private object buildInstanceWithArgs(Type pluginType, Instance defaultInstance, ExplicitArguments args, string requestedName) { @@ -561,11 +510,16 @@ } _pluginGraph = pluginGraph; + + var thisInstance = new ObjectInstance(this); + _pluginGraph.FindFamily(typeof(IContainer)).AddInstance(thisInstance); + _pluginGraph.ProfileManager.SetDefault(typeof(IContainer), thisInstance); + pluginGraph.Log.AssertFailures(); _pipelineGraph = new PipelineGraph(pluginGraph); - _pipelineGraph.Inject<IContainer>(this); + } [Obsolete("delegate to something cleaner in BuildSession")] @@ -583,7 +537,7 @@ private BuildSession withNewSession(string name) { - return new BuildSession(_pipelineGraph, _interceptorLibrary, _transientCache) + return new BuildSession(_pipelineGraph, _interceptorLibrary) { RequestedName = name }; @@ -644,5 +598,31 @@ } #endregion + + /// <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) + { + Configure(x => x.For<PLUGINTYPE>().Use(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) + { + Configure(x => x.For(pluginType).Use(@object)); + } + + } } \ No newline at end of file Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -18,7 +18,7 @@ private List<Instance> _explicitInstances; public ValidationBuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary) - : base(pipelineGraph, interceptorLibrary, new NulloObjectCache()) + : base(pipelineGraph, interceptorLibrary) { } @@ -104,14 +104,11 @@ _explicitInstances = pipelineGraph.GetAllInstances(); _errors = new ErrorCollection(); - foreach (PluginTypeConfiguration pluginType in pipelineGraph.PluginTypes) + pipelineGraph.EachInstance((t, i) => { - foreach (Instance instance in pluginType.Instances) - { - _buildStack = new BuildStack(); - validateInstance(pluginType.PluginType, instance); - } - } + _buildStack = new BuildStack(); + validateInstance(t, i); + }); } public string BuildErrorMessages() Modified: trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -10,7 +10,7 @@ public class WhatDoIHaveWriter { private readonly PipelineGraph _graph; - private List<IInstance> _instances; + private List<InstanceRef> _instances; private TextReportWriter _writer; public WhatDoIHaveWriter(PipelineGraph graph) @@ -32,12 +32,12 @@ private void writeContentsOfPluginTypes(StringWriter stringWriter) { _writer = new TextReportWriter(3); - _instances = new List<IInstance>(); + _instances = new List<InstanceRef>(); _writer.AddDivider('='); _writer.AddText("PluginType", "Name", "Description"); - foreach (PluginTypeConfiguration pluginType in _graph.PluginTypes) + foreach (IPluginTypeConfiguration pluginType in _graph.GetPluginTypes(null)) { writePluginType(pluginType); } @@ -64,7 +64,7 @@ writer.WriteLine(); } - private void writePluginType(PluginTypeConfiguration pluginType) + private void writePluginType(IPluginTypeConfiguration pluginType) { _writer.AddDivider('-'); var contents = new[] @@ -90,13 +90,13 @@ _writer.AddContent("Scoped as: PerRequest"); } - foreach (IInstance instance in pluginType.Instances) + foreach (InstanceRef instance in pluginType.Instances) { writeInstance(instance); } } - private void writeInstance(IInstance instance) + private void writeInstance(InstanceRef instance) { if (_instances.Contains(instance)) { @@ -110,7 +110,7 @@ } - private void setContents(string[] contents, IInstance instance) + private void setContents(string[] contents, InstanceRef instance) { contents[1] = instance.Name; contents[2] = instance.Description; Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using StructureMap.Pipeline; +using StructureMap.Query; using StructureMap.Util; namespace StructureMap.Graph @@ -16,14 +17,11 @@ public int FamilyCount { get { return _families.Count; } } - public IEnumerable<PluginTypeConfiguration> Families + public IEnumerable<PluginFamily> Families { get { - foreach (PluginFamily family in _families.GetAll()) - { - yield return family.GetConfiguration(); - } + return _families.GetAll(); } } Modified: trunk/Source/StructureMap/Graph/IPluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,5 +1,4 @@ using System; -using StructureMap.Attributes; using StructureMap.Pipeline; namespace StructureMap.Graph Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using StructureMap.Attributes; using StructureMap.Pipeline; using StructureMap.Query; using StructureMap.TypeRules; @@ -57,6 +56,12 @@ public void SetScopeTo(InstanceScope scope) { + if (scope == InstanceScope.Transient) + { + _lifecycle = null; + return; + } + _lifecycle = Lifecycles.GetLifecycle(scope); } @@ -79,7 +84,13 @@ _instances[instance.Name] = instance; } + public void SetDefault(Instance instance) + { + AddInstance(instance); + DefaultInstanceKey = instance.Name; + } + // For testing public InstanceMemento GetMemento(string instanceKey) { @@ -156,9 +167,13 @@ return _instances.Exists(instance => instance.Matches(plugin)); } - public void EachInstance(Action<Instance> action) + + public IEnumerable<Instance> Instances { - _instances.Each(action); + get + { + return _instances.GetAll(); + } } public Instance GetInstance(string name) @@ -243,7 +258,8 @@ public void ImportFrom(PluginFamily source) { - source.EachInstance(instance => _instances.Fill(instance.Name, instance)); + source.Instances.Each(instance => _instances.Fill(instance.Name, instance)); + source._pluggedTypes.Each((key, plugin) => _pluggedTypes.Fill(key, plugin)); if (source.MissingInstance != null) @@ -314,18 +330,6 @@ } } - public PluginTypeConfiguration GetConfiguration() - { - return new PluginTypeConfiguration - { - Default = GetDefaultInstance(), - PluginType = PluginType, - Lifecycle = _lifecycle, - Instances = Instances - }; - } - - [Obsolete("replace with Instances")] public void ForInstance(string name, Action<Instance> action) { _instances.WithValue(name, action); @@ -340,9 +344,6 @@ public int InstanceCount { get { return _instances.Count; } } - [Obsolete] - public IEnumerable<IInstance> Instances { get { return _instances.GetAll(); } } - public Instance MissingInstance { get; set; } /// <summary> @@ -353,6 +354,7 @@ /// <summary> /// The InstanceKey of the default instance of the PluginFamily /// </summary> + [Obsolete] public string DefaultInstanceKey { get { return _defaultKey; } set { _defaultKey = value ?? string.Empty; } } #endregion Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/IContainer.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -135,15 +135,6 @@ /// <param name="object"></param> void Inject(Type pluginType, object @object); - /// <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="instance"></param> - void Inject<T>(string name, T instance); /// <summary> /// Sets the default instance for all PluginType's to the designated Profile. Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -42,7 +42,7 @@ _pluginType = family.PluginType; MissingInstance = family.MissingInstance; - family.EachInstance(AddInstance); + family.Instances.Each(AddInstance); } catch (StructureMapException) { @@ -105,8 +105,9 @@ _lifecycle = family.Lifecycle; } - family.EachInstance(instance => _instances.Fill(instance.Name, instance)); + family.Instances.Each(instance => _instances.Fill(instance.Name, instance)); + if (family.MissingInstance != null) { MissingInstance = family.MissingInstance; Copied: trunk/Source/StructureMap/InstanceScope.cs (from rev 302, trunk/Source/StructureMap/Attributes/InstanceScope.cs) =================================================================== --- trunk/Source/StructureMap/InstanceScope.cs (rev 0) +++ trunk/Source/StructureMap/InstanceScope.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,15 @@ +namespace StructureMap +{ + public enum InstanceScope + { + PerRequest, + Singleton, + ThreadLocal, + HttpContext, + Hybrid, + HttpSession, + HybridHttpSession, + Unique, + Transient + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/ObjectFactory.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -63,24 +63,6 @@ } - [Obsolete("Please use GetInstance(Type) instead")] - public static object FillDependencies(Type type) - { - return container.FillDependencies(type); - } - - [Obsolete("Please use GetInstance<T>() instead")] - public static T FillDependencies<T>() - { - return (T) container.FillDependencies(typeof (T)); - } - - [Obsolete("Please use Inject(Type, object) instead.")] - public static void InjectStub(Type pluginType, object stub) - { - Inject(pluginType, stub); - } - /// <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 @@ -93,12 +75,6 @@ container.Inject(pluginType, instance); } - [Obsolete("Please use Inject() instead.")] - public static void InjectStub<PLUGINTYPE>(PLUGINTYPE stub) - { - Inject(stub); - } - /// <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 @@ -111,25 +87,7 @@ container.Inject(instance); } - /// <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="PLUGINTYPE"></typeparam> - /// <param name="name"></param> - /// <param name="instance"></param> - public static void Inject<PLUGINTYPE>(string name, PLUGINTYPE instance) - { - container.Inject(name, instance); - } - [Obsolete("Please use Inject<PLUGINTYPE>(name) instead.")] - public static void InjectStub<PLUGINTYPE>(string name, PLUGINTYPE stub) - { - Inject(name, stub); - } - /// <summary> /// Returns a report detailing the complete configuration of all PluginTypes and Instances /// </summary> Modified: trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Web; @@ -34,6 +35,11 @@ return (IObjectCache) items[ITEM_NAME]; } + public string Scope + { + get { return InstanceScope.HttpContext.ToString(); } + } + public static bool HasContext() { return HttpContext.Current != null; Modified: trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,5 @@ +using System; + namespace StructureMap.Pipeline { public abstract class HttpLifecycleBase<HTTP, NONHTTP> : ILifecycle @@ -25,9 +27,7 @@ ? _http.FindCache() : _nonHttp.FindCache(); } - } - public class HybridLifecycle : HttpLifecycleBase<HttpContextLifecycle, ThreadLocalStorageLifecycle> - { + public abstract string Scope { get;} } } \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/HybridLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HybridLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,10 @@ +namespace StructureMap.Pipeline +{ + public class HybridLifecycle : HttpLifecycleBase<HttpContextLifecycle, ThreadLocalStorageLifecycle> + { + public override string Scope + { + get { return InstanceScope.Hybrid.ToString(); } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,5 @@ +using System; + namespace StructureMap.Pipeline { public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> @@ -2,2 +4,6 @@ { + public override string Scope + { + get { return InstanceScope.HybridHttpSession.ToString(); } + } } Modified: trunk/Source/StructureMap/Pipeline/ILifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ILifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/ILifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,5 @@ +using StructureMap.Attributes; + namespace StructureMap.Pipeline { public interface ILifecycle @@ -4,5 +6,6 @@ { void EjectAll(); IObjectCache FindCache(); + string Scope { get; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -2,13 +2,10 @@ using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Interceptors; -using StructureMap.Query; namespace StructureMap.Pipeline { - - - public interface IDiagnosticInstance : IInstance + public interface IDiagnosticInstance { bool CanBePartOfPluginFamily(PluginFamily family); Instance FindInstanceForProfile(PluginFamily family, string profileName, GraphLog log); @@ -38,7 +35,10 @@ #region IDiagnosticInstance Members public string Name { get { return _name; } set { _name = value; } } + internal Type ConcreteType { get { return getConcreteType(null); } } + internal string Description { get { return getDescription(); } } + bool IDiagnosticInstance.CanBePartOfPluginFamily(PluginFamily family) { return canBePartOfPluginFamily(family); @@ -59,10 +59,6 @@ preprocess(family); } - Type IInstance.ConcreteType { get { return getConcreteType(null); } } - - string IInstance.Description { get { return getDescription(); } } - #endregion public virtual object Build(Type pluginType, BuildSession session) Modified: trunk/Source/StructureMap/Pipeline/Lifecycles.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycles.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/Lifecycles.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,5 +1,4 @@ using System; -using StructureMap.Attributes; namespace StructureMap.Pipeline { @@ -29,6 +28,9 @@ case InstanceScope.HybridHttpSession: return new HybridSessionLifecycle(); + + case InstanceScope.Unique: + return new UniquePerRequestLifecycle(); } throw new ArgumentOutOfRangeException("scope"); Modified: trunk/Source/StructureMap/Pipeline/ObjectBuilder.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ObjectBuilder.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/ObjectBuilder.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -5,17 +5,15 @@ { public class ObjectBuilder { - private readonly IObjectCache _defaultCache; private readonly InterceptorLibrary _library; private readonly PipelineGraph _pipeline; - public ObjectBuilder(PipelineGraph pipeline, InterceptorLibrary library, IObjectCache defaultCache) + public ObjectBuilder(PipelineGraph pipeline, InterceptorLibrary library) { if (pipeline == null) throw new ArgumentNullException("pipeline"); _pipeline = pipeline; _library = library; - _defaultCache = defaultCache; } public object Resolve(Type pluginType, Instance instance, BuildSession session) @@ -59,10 +57,7 @@ public IObjectCache FindCache(Type pluginType, Instance instance, BuildSession session) { - ILifecycle lifecycle = _pipeline.ForType(pluginType).Lifecycle; - return lifecycle == null - ? _defaultCache - : lifecycle.FindCache(); + return _pipeline.FindCache(pluginType); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,5 @@ +using System; + namespace StructureMap.Pipeline { public class SingletonLifecycle : ILifecycle @@ -13,5 +15,10 @@ { return _cache; } + + public string Scope + { + get { return InstanceScope.Singleton.ToString(); } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -18,6 +18,11 @@ return _cache; } + public string Scope + { + get { return InstanceScope.ThreadLocal.ToString(); } + } + private void guaranteeHashExists() { if (_cache == null) Modified: trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,3 +1,5 @@ +using System; + namespace StructureMap.Pipeline { /// <summary> @@ -14,39 +16,10 @@ return new NulloObjectCache(); } - //#region IBuildInterceptor Members + public string Scope + { + get { return InstanceScope.Unique.ToString(); } } - //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 } } \ No newline at end of file Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -19,12 +19,14 @@ private readonly GenericsPluginGraph _genericsGraph = new GenericsPluginGraph(); private readonly GraphLog _log; private readonly ProfileManager _profileManager; + private readonly IObjectCache _transientCache; private MissingFactoryFunction _missingFactory = (pluginType, profileManager) => null; public PipelineGraph(PluginGraph graph) { + _transientCache = new NulloObjectCache(); _profileManager = graph.ProfileManager; _log = graph.Log; @@ -47,6 +49,7 @@ _profileManager = profileManager; _genericsGraph = genericsGraph; _log = log; + _transientCache = new MainObjectCache(); } public GraphLog Log { get { return _log; } } @@ -55,28 +58,16 @@ public string CurrentProfile { get { return _profileManager.CurrentProfile; } set { _profileManager.CurrentProfile = value; } } - public IEnumerable<PluginTypeConfiguration> PluginTypes + public IEnumerable<IPluginTypeConfiguration> GetPluginTypes(IContainer container) { - get + foreach (PluginFamily family in _genericsGraph.Families) { - foreach (PluginTypeConfiguration configuration in _genericsGraph.Families) - { - yield return configuration; - } + yield return new GenericFamilyConfiguration(family); + } - var factories = new IInstanceFactory[_factories.Count]; - _factories.Values.CopyTo(factories, 0); - - foreach (IInstanceFactory factory in factories) - { - yield return new PluginTypeConfiguration - { - Default = _profileManager.GetDefault(factory.PluginType), - PluginType = factory.PluginType, - Lifecycle = factory.Lifecycle, - Instances = factory.AllInstances - }; - } + foreach (IInstanceFactory factory in _factories.Values.ToArray()) + { + yield return new InstanceFactoryTypeConfiguration(factory.PluginType, container, this); } } @@ -101,9 +92,11 @@ _factories.Clear(); _profileManager.Dispose(); _genericsGraph.ClearAll(); + + _transientCache.DisposeAndClear(); } - public PipelineGraph Clone() + public PipelineGraph ToNestedGraph() { var clone = new PipelineGraph(_profileManager.Clone(), _genericsGraph.Clone(), _log) { @@ -198,37 +191,13 @@ ForType(typeof (T)).AddInstance(instance); } - public Instance Inject<PLUGINTYPE>(PLUGINTYPE instance) - { - var literalInstance = new ObjectInstance(instance); - ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance); - SetDefault(typeof (PLUGINTYPE), literalInstance); - - return literalInstance; - } - public void EjectAllInstancesOf<T>() { ForType(typeof (T)).EjectAllInstances(); _profileManager.EjectAllInstancesOf<T>(); } - [Obsolete("Move this to PluginTypeConfiguration")] - public IEnumerable<IInstance> InstancesOf(Type pluginType) - { - if (_genericsGraph.HasFamily(pluginType)) - { - return _genericsGraph.FindFamily(pluginType).Instances; - } - if (_factories.ContainsKey(pluginType)) - { - return _factories[pluginType].AllInstances; - } - - return new IInstance[0]; - } - public List<Instance> GetAllInstances() { return _factories.Values.SelectMany(x => x.AllInstances).ToList(); @@ -249,5 +218,21 @@ { return ForType(pluginType).FindInstance(instanceKey) != null; } + + public void EachInstance(Action<Type, Instance> action) + { + _factories.Values.Each(f => + { + f.AllInstances.Each(i => action(f.PluginType, i)); + }); + } + + public IObjectCache FindCache(Type pluginType) + { + ILifecycle lifecycle = ForType(pluginType).Lifecycle; + return lifecycle == null + ? _transientCache + : lifecycle.FindCache(); + } } } \ No newline at end of file Deleted: trunk/Source/StructureMap/PluginTypeConfiguration.cs =================================================================== --- trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using StructureMap.Pipeline; -using StructureMap.Query; - -namespace StructureMap -{ - /// <summary> - /// Metadata describing the registration of a PluginType - /// </summary> - public class PluginTypeConfiguration - { - public Type PluginType { get; set; } - - /// <summary> - /// The "instance" that will be used when Container.GetInstance(PluginType) is called. - /// See <see cref="IInstance">IInstance</see> for more information - /// </summary> - public IInstance Default { get; set; } - - /// <summary> - /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods - /// </summary> - public ILifecycle Lifecycle { get; set; } - - /// <summary> - /// All of the <see cref="IInstance">IInstance</see>'s registered - /// for this PluginType - /// </summary> - public IEnumerable<IInstance> Instances { get; set; } - } -} \ No newline at end of file Added: trunk/Source/StructureMap/Query/EmptyConfiguration.cs =================================================================== --- trunk/Source/StructureMap/Query/EmptyConfiguration.cs (rev 0) +++ trunk/Source/StructureMap/Query/EmptyConfiguration.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; + +namespace StructureMap.Query +{ + public class EmptyConfiguration : IPluginTypeConfiguration + { + private readonly Type _pluginType; + + public EmptyConfiguration(Type pluginType) + { + _pluginType = pluginType; + } + + public Type PluginType + { + get { return _pluginType; } + } + + /// <summary> + /// The "instance" that will be used when Container.GetInstance(PluginType) is called. + /// See <see cref="InstanceRef">InstanceRef</see> for more information + /// </summary> + public InstanceRef Default + { + get { return null; } } + + /// <summary> + /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods + /// </summary> + public string Lifecycle + { + get { return null; } } + + /// <summary> + /// All of the <see cref="InstanceRef">InstanceRef</see>'s registered + /// for this PluginType + /// </summary> + public IEnumerable<InstanceRef> Instances + { + get { return new InstanceRef[0]; } } + + /// <summary> + /// Simply query to see if there are any implementations registered + /// </summary> + /// <returns></returns> + public bool HasImplementations() + { + return false; + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Query/GenericFamilyConfiguration.cs =================================================================== --- trunk/Source/StructureMap/Query/GenericFamilyConfiguration.cs (rev 0) +++ trunk/Source/StructureMap/Query/GenericFamilyConfiguration.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using StructureMap.Graph; +using StructureMap.Pipeline; + +namespace StructureMap.Query +{ + public class GenericFamilyConfiguration : IPluginTypeConfiguration, IFamily + { + private readonly PluginFamily _family; + + public GenericFamilyConfiguration(PluginFamily family) + { + _family = family; + } + + void IFamily.Eject(Instance instance) + { + } + + object IFamily.Build(Instance instance) + { + return null; + } + + bool IFamily.HasBeenCreated(Instance instance) + { + return false; + } + + public Type PluginType { get { return _family.PluginType; } } + + /// <summary> + /// The "instance" that will be used when Container.GetInstance(PluginType) is called. + /// See <see cref="InstanceRef">InstanceRef</see> for more information + /// </summary> + public InstanceRef Default + { + get + { + Instance defaultInstance = _family.GetDefaultInstance(); + return defaultInstance == null ? null : new InstanceRef(defaultInstance, this); + } + } + + /// <summary> + /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods + /// </summary> + public string Lifecycle + { + get + { + return _family.Lifecycle.ToName(); + } + } + + /// <summary> + /// All of the <see cref="InstanceRef">InstanceRef</see>'s registered + /// for this PluginType + /// </summary> + public IEnumerable<InstanceRef> Instances + { + get + { + return _family.Instances.Select(x => new InstanceRef(x, this)); + } + } + + /// <summary> + /// Simply query to see if there are any implementations registered + /// </summary> + /// <returns></returns> + public bool HasImplementations() + { + return _family.InstanceCount > 0; + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Query/IFamily.cs =================================================================== --- trunk/Source/StructureMap/Query/IFamily.cs (rev 0) +++ trunk/Source/StructureMap/Query/IFamily.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,13 @@ +using System; +using StructureMap.Pipeline; + +namespace StructureMap.Query +{ + public interface IFamily + { + Type PluginType { get; } + void Eject(Instance instance); + object Build(Instance instance); + bool HasBeenCreated(Instance instance); + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Query/IModel.cs =================================================================== --- trunk/Source/StructureMap/Query/IModel.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Query/IModel.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -5,20 +5,8 @@ namespace StructureMap.Query { - public interface IInstance - { - string Name { get; } - /// <summary> - /// The actual concrete type of this Instance. Not every type of IInstance - /// can determine the ConcreteType - /// </summary> - Type ConcreteType { get; } - - string Description { get; } - } - /// <summary> /// Models the state of a Container or ObjectFactory. Can be used to query for the /// existence of types registered with StructureMap @@ -28,9 +16,9 @@ /// <summary> /// Access to all the <seealso cref="PluginTypeConfiguration">Plugin Type</seealso> registrations /// </summary> - IEnumerable<PluginTypeConfiguration> PluginTypes { get; } + IEnumerable<IPluginTypeConfiguration> PluginTypes { get; } - IEnumerable<IInstance> AllInstances { get; } + IEnumerable<InstanceRef> AllInstances { get; } /// <summary> /// Can StructureMap fulfill a request to ObjectFactory.GetInstance(pluginType) from the @@ -55,13 +43,13 @@ /// </summary> /// <param name="pluginType"></param> /// <returns></returns> - IEnumerable<IInstance> InstancesOf(Type pluginType); + IEnumerable<InstanceRef> InstancesOf(Type pluginType); /// <summary> /// Queryable access to all of the <see cref="IInstance">IInstance</see> for a given PluginType /// </summary> /// <returns></returns> - IEnumerable<IInstance> InstancesOf<T>(); + IEnumerable<InstanceRef> InstancesOf<T>(); /// <summary> /// Does the current container have existing configuration for the "pluginType" @@ -92,5 +80,19 @@ /// </summary> /// <returns></returns> Type DefaultTypeFor(Type pluginType); + + /// <summary> + /// Retrieves the configuration for the given type + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + IPluginTypeConfiguration For<T>(); + + /// <summary> + /// Retrieves the configuration for the given type + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + IPluginTypeConfiguration For(Type type); } } \ No newline at end of file Added: trunk/Source/StructureMap/Query/IPluginTypeConfiguration.cs =================================================================== --- trunk/Source/StructureMap/Query/IPluginTypeConfiguration.cs (rev 0) +++ trunk/Source/StructureMap/Query/IPluginTypeConfiguration.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; + +namespace StructureMap.Query +{ + public interface IPluginTypeConfiguration + { + Type PluginType { get; } + + /// <summary> + /// The "instance" that will be used when Container.GetInstance(PluginType) is called. + /// See <see cref="InstanceRef">InstanceRef</see> for more information + /// </summary> + InstanceRef Default { get; } + + /// <summary> + /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods + /// </summary> + string Lifecycle { get; } + + /// <summary> + /// All of the <see cref="InstanceRef">InstanceRef</see>'s registered + /// for this PluginType + /// </summary> + IEnumerable<InstanceRef> Instances { get; } + + /// <summary> + /// Simply query to see if there are any implementations registered + /// </summary> + /// <returns></returns> + bool HasImplementations(); + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Query/InstanceFactoryTypeConfiguration.cs =================================================================== --- trunk/Source/StructureMap/Query/InstanceFactoryTypeConfiguration.cs (rev 0) +++ trunk/Source/StructureMap/Query/InstanceFactoryTypeConfiguration.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using StructureMap.Pipeline; + +namespace StructureMap.Query +{ + public class InstanceFactoryTypeConfiguration : IPluginTypeConfiguration, IFamily + { + private readonly IContainer _container; + private readonly PipelineGraph _graph; + private readonly Type _pluginType; + + public InstanceFactoryTypeConfiguration(Type pluginType, IContainer container, PipelineGraph graph) + { + _pluginType = pluginType; + _container = container; + _graph = graph; + } + + private IObjectCache cache { get { return _graph.FindCache(_pluginType); } } + private IInstanceFactory factory { get { return _graph.ForType(_pluginType); } } + + void IFamily.Eject(Instance instance) + { + cache.Eject(_pluginType, instance); + } + + object IFamily.Build(Instance instance) + { + // It's important to use this overload to get it to + // respect the lifecycle. I think. It works, so leave + // it alone. + return _container.GetInstance(_pluginType, instance.Name); + } + + bool IFamily.HasBeenCreated(Instance instance) + { + return cache.Has(_pluginType, instance); + } + + public Type PluginType { get { return _pluginType; } } + + /// <summary> + /// The "instance" that will be used when Container.GetInstance(PluginType) is called. + /// See <see cref="InstanceRef">InstanceRef</see> for more information + /// </summary> + public InstanceRef Default + { + get + { + Instance instance = _graph.GetDefault(_pluginType); + return toRef(instance); + } + } + + /// <summary> + /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods + /// </summary> + public string Lifecycle { get { return factory.Lifecycle.ToName(); } } + + /// <summary> + /// All of the <see cref="InstanceRef">InstanceRef</see>'s registered + /// for this PluginType + /// </summary> + public IEnumerable<InstanceRef> Instances { get { return factory.AllInstances.Select(x => toRef(x)); } } + + /// <summary> + /// Simply query to see if there are any implementations registered + /// </summary> + /// <returns></returns> + public bool HasImplementations() + { + return factory.AllInstances.Any(); + } + + private InstanceRef toRef(Instance instance) + { + if (instance == null) return null; + + return new InstanceRef(instance, this); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Query/InstanceRef.cs =================================================================== --- trunk/Source/StructureMap/Query/InstanceRef.cs (rev 0) +++ trunk/Source/StructureMap/Query/InstanceRef.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -0,0 +1,45 @@ +using System; +using StructureMap.Pipeline; + +namespace StructureMap.Query +{ + public class InstanceRef + { + private readonly IFamily _family; + private readonly Instance _instance; + + public InstanceRef(Instance instance, IFamily family) + { + _instance = instance; + _family = family; + } + + + public string Name { get { return _instance.Name; } } + + /// <summary> + /// The actual concrete type of this Instance. Not every type of IInstance + /// can determine the ConcreteType + /// </summary> + public Type ConcreteType { get { return _instance.ConcreteType; } } + + + public string Description { get { return _instance.Description; } } + public Type PluginType { get { return _family.PluginType; } } + + public void EjectObject() + { + _family.Eject(_instance); + } + + public T Get<T>() where T : class + { + return _family.Build(_instance) as T; + } + + public bool ObjectHasBeenCreated() + { + return _family.HasBeenCreated(_instance); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Query/Model.cs =================================================================== --- trunk/Source/StructureMap/Query/Model.cs 2009-12-27 16:51:25 UTC (rev 305) +++ trunk/Source/StructureMap/Query/Model.cs 2009-12-28 01:17:17 UTC (rev 306) @@ -1,19 +1,16 @@ using System; using System.Collections.Generic; using System.Linq; -using StructureMap.Pipeline; namespace StructureMap.Query { public class Model : IModel { - private readonly PipelineGraph _graph; - private readonly IContainer _container; + private readonly IEnumerable<IPluginTypeConf... [truncated message content] |