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