From: <jer...@us...> - 2009-04-20 01:47:22
|
Revision: 240 http://structuremap.svn.sourceforge.net/structuremap/?rev=240&view=rev Author: jeremydmiller Date: 2009-04-20 01:47:17 +0000 (Mon, 20 Apr 2009) Log Message: ----------- The big, big lifecycle refactoring Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs trunk/Source/StructureMap/Graph/IPluginFamily.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/Lifecycle.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/PluginTypeConfiguration.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/SystemRegistry.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildLifecycleTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStorageLifecycleTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildPolicyTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/BuildSession.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -11,14 +11,15 @@ private readonly BuildStack _buildStack = new BuildStack(); private readonly InstanceCache _cache = new InstanceCache(); private readonly Cache<Type, Func<object>> _defaults; - private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; + private readonly ObjectBuilder _builder; public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary) { _pipelineGraph = pipelineGraph; - _interceptorLibrary = interceptorLibrary; + _builder = new ObjectBuilder(_pipelineGraph, interceptorLibrary, new NulloObjectCache()); + _defaults = new Cache<Type, Func<object>>(t => { Instance instance = _pipelineGraph.GetDefault(t); @@ -28,9 +29,7 @@ throw new StructureMapException(202, t); } - object createdInstance = CreateInstance(t, instance); - - return () => createdInstance; + return () => CreateInstance(t, instance); }); } @@ -129,9 +128,14 @@ if (result == null) { - result = forType(pluginType).Build(this, instance); + result = _builder.Resolve(pluginType, instance, this); - _cache.Set(pluginType, instance, result); + // TODO: HACK ATTACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + var isUnique = forType(pluginType).Lifecycle is UniquePerRequestLifecycle; + if (!isUnique) + { + _cache.Set(pluginType, instance, result); + } } return result; @@ -161,13 +165,6 @@ return _defaults[pluginType](); } - [Obsolete("get this inlined")] - public virtual object ApplyInterception(Type pluginType, object actualValue) - { - if (actualValue == null) return null; - return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue, this); - } - public virtual void RegisterDefault(Type pluginType, Func<object> creator) { _defaults[pluginType] = creator; Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -261,30 +261,18 @@ } /// <summary> - /// Registers an IBuildInterceptor for this Plugin Type that executes before - /// any object of this PluginType is created. IBuildInterceptor's can be + /// Registers an ILifecycle for this Plugin Type that executes before + /// any object of this PluginType is created. ILifecycle's can be /// used to create a custom scope /// </summary> - /// <param name="interceptor"></param> + /// <param name="lifecycle"></param> /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> InterceptConstructionWith(IBuildInterceptor interceptor) + public CreatePluginFamilyExpression<PLUGINTYPE> LifecycleIs(ILifecycle lifecycle) { - _alterations.Add(family => family.AddInterceptor(interceptor)); + _alterations.Add(family => family.SetScopeTo(lifecycle)); return this; } - /// <summary> - /// Registers an IBuildInterceptor for this Plugin Type that executes before - /// any object of this PluginType is created. IBuildInterceptor's can be - /// used to create a custom scope - /// </summary> - /// <param name="interceptor"></param> - /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> BuildPolicyIs(IBuildInterceptor interceptor) - { - _alterations.Add(family => family.AddInterceptor(interceptor)); - return this; - } /// <summary> /// Largely deprecated and unnecessary with the ability to add Xml configuration files @@ -314,7 +302,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> AlwaysUnique() { - return InterceptConstructionWith(new UniquePerRequestInterceptor()); + return this.LifecycleIs(new UniquePerRequestLifecycle()); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -144,11 +144,11 @@ /// any object of this PluginType is created. IBuildInterceptor's can be /// used to create a custom scope /// </summary> - /// <param name="interceptor"></param> + /// <param name="lifecycle"></param> /// <returns></returns> - public GenericFamilyExpression InterceptConstructionWith(IBuildInterceptor interceptor) + public GenericFamilyExpression LifecycleIs(ILifecycle lifecycle) { - return alterAndContinue(family => family.AddInterceptor(interceptor)); + return alterAndContinue(family => family.SetScopeTo(lifecycle)); } /// <summary> Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -127,10 +127,12 @@ { var interceptorMemento = new XmlAttributeInstanceMemento(element); string context = contextBase + element.OuterXml; - _builder.WithSystemObject<IBuildInterceptor>( + + + _builder.WithSystemObject<ILifecycle>( interceptorMemento, context, - interceptor => family.AddInterceptor(interceptor)); + lifecycle => family.SetScopeTo(lifecycle)); }); } } Modified: trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -79,7 +79,14 @@ _writer.AddText(contents); - _writer.AddContent("Scoped as: " + pluginType.Policy); + if (pluginType.Lifecycle != null) + { + _writer.AddContent("Scoped as: " + pluginType.Lifecycle.GetType().Name); + } + else + { + _writer.AddContent("Scoped as: PerRequest"); + } foreach (IInstance instance in pluginType.Instances) { Modified: trunk/Source/StructureMap/Graph/IPluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Graph/IPluginFamily.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -19,6 +19,8 @@ void AddMementoSource(MementoSource source); void SetScopeTo(InstanceScope scope); - void AddInterceptor(IBuildInterceptor interceptor); + void SetScopeTo(ILifecycle lifecycle); + + ILifecycle Lifecycle {get; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -17,7 +17,7 @@ private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>(); private readonly Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); private readonly Type _pluginType; - private IBuildPolicy _buildPolicy = new BuildPolicy(); + private ILifecycle _lifecycle = null; private string _defaultKey = string.Empty; private PluginGraph _parent; @@ -43,7 +43,16 @@ } } + public void SetScopeTo(ILifecycle lifecycle) + { + _lifecycle = lifecycle; + } + public ILifecycle Lifecycle + { + get { return _lifecycle; } + } + public PluginGraph Parent { get { return _parent; } @@ -59,40 +68,9 @@ public void SetScopeTo(InstanceScope scope) { - switch (scope) - { - case InstanceScope.Singleton: - AddInterceptor(new SingletonPolicy()); - break; - - case InstanceScope.HttpContext: - AddInterceptor(new HttpContextBuildPolicy()); - break; - - case InstanceScope.ThreadLocal: - AddInterceptor(new ThreadLocalStoragePolicy()); - break; - - case InstanceScope.Hybrid: - AddInterceptor(new HybridBuildPolicy()); - break; - - case InstanceScope.HttpSession: - AddInterceptor(new HybridSessionBuildPolicy()); - break; - - case InstanceScope.HybridHttpSession: - AddInterceptor(new HybridSessionBuildPolicy()); - break; - } + _lifecycle = Lifecycles.GetLifecycle(scope); } - [Obsolete("Kill!")] - public void AddInterceptor(IBuildInterceptor interceptor) - { - interceptor.InnerPolicy = _buildPolicy; - _buildPolicy = interceptor; - } #endregion @@ -292,7 +270,7 @@ Type templatedType = _pluginType.MakeGenericType(templateTypes); var templatedFamily = new PluginFamily(templatedType, Parent); templatedFamily.DefaultInstanceKey = DefaultInstanceKey; - templatedFamily.Policy = Policy.Clone(); + templatedFamily._lifecycle = _lifecycle; // TODO -- Got a big problem here. Intances need to be copied over @@ -330,7 +308,7 @@ { Default = GetDefaultInstance(), PluginType = PluginType, - Policy = _buildPolicy, + Lifecycle = _lifecycle, Instances = Instances }; } @@ -342,11 +320,7 @@ get { return _pluginType.IsGenericTypeDefinition || _pluginType.ContainsGenericParameters; } } - public IBuildPolicy Policy - { - get { return _buildPolicy; } - set { _buildPolicy = value; } - } + public int PluginCount { Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -13,9 +13,6 @@ { Type PluginType { get; } IEnumerable<IInstance> Instances { get; } - - [Obsolete("Kill!!!!")] - IBuildPolicy Policy { get; } Instance MissingInstance { get; set; } Instance[] AllInstances @@ -26,12 +23,6 @@ void AddInstance(Instance instance); Instance AddType<T>(); - [Obsolete("Return the list of Instances instead")] - IList GetAllInstances(BuildSession session); - - [Obsolete("Kill!!!!")] - object Build(BuildSession session, Instance instance); - Instance FindInstance(string name); void ImportFrom(PluginFamily family); Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -16,7 +16,7 @@ new Cache<string, Instance>(delegate { return null; }); private readonly Type _pluginType; - private IBuildPolicy _policy = new BuildPolicy(); + private ILifecycle _lifecycle; #region constructor functions @@ -38,7 +38,7 @@ try { - _policy = family.Policy; + _lifecycle = family.Lifecycle; _pluginType = family.PluginType; MissingInstance = family.MissingInstance; @@ -95,14 +95,7 @@ } } - [Obsolete("Kill!!!!")] - public IBuildPolicy Policy - { - get { return _policy; } - set { _policy = value; } - } - public void AddInstance(Instance instance) { _instances[instance.Name] = instance; @@ -120,25 +113,6 @@ return instance; } - public IList GetAllInstances(BuildSession session) - { - IList list = new ArrayList(); - - _instances.Each(instance => - { - object builtObject = Build(session, instance); - list.Add(builtObject); - }); - - return list; - } - - [Obsolete("Kill!!!!")] - public object Build(BuildSession session, Instance instance) - { - return _policy.Build(session, PluginType, instance); - } - public Instance FindInstance(string name) { return _instances[name] ?? MissingInstance; @@ -146,10 +120,14 @@ public void ImportFrom(PluginFamily family) { - if (!_policy.GetType().Equals(family.Policy.GetType())) + if (_lifecycle == null) { + _lifecycle = family.Lifecycle; + } + else if (!_lifecycle.GetType().Equals(family.Lifecycle.GetType())) + { // TODO: Might need to clear out the existing policy when it's ejected - _policy = family.Policy; + _lifecycle = family.Lifecycle; } family.EachInstance(instance => _instances.Fill(instance.Name, instance)); @@ -162,13 +140,14 @@ public void EjectAllInstances() { - _policy.EjectAll(); + if (_lifecycle != null) _lifecycle.EjectAll(); _instances.Clear(); } public ILifecycle Lifecycle { - get { throw new NotImplementedException(); } + get { return _lifecycle; } + set { _lifecycle = value; } } #endregion Deleted: trunk/Source/StructureMap/Pipeline/BuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,65 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - [Obsolete("Kill!")] - public sealed class BuildPolicy : IBuildPolicy - { - #region IBuildPolicy Members - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - if (buildSession == null) - { - throw new ArgumentNullException("buildSession"); - } - - object builtObject = instance.Build(pluginType, buildSession); - - try - { - return buildSession.ApplyInterception(pluginType, builtObject); - } - catch (Exception e) - { - throw new StructureMapException(308, e, instance.Name, builtObject.GetType()); - } - } - - public IBuildPolicy Clone() - { - return this; - } - - public void EjectAll() - { - // no-op. Unlike other Container's, StructureMap doesn't hang on to - // objects it created as "Transients" - } - - #endregion - - public bool Equals(BuildPolicy obj) - { - return !ReferenceEquals(null, obj); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - return obj is BuildPolicy; - } - - public override int GetHashCode() - { - return 0; - } - - public override string ToString() - { - return InstanceScope.PerRequest.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,86 +0,0 @@ -using System; -using StructureMap.Util; - -namespace StructureMap.Pipeline -{ - - - - [Obsolete("Kill! in favor of MainObjectCache")] - public class ObjectCache : Cache<InstanceKey, object> - { - public ObjectCache(IBuildPolicy innerPolicy) : base(key => innerPolicy.Build(key.Session, key.PluginType, key.Instance)) - { - } - - public void DisposeAndClear() - { - Each(o => - { - IDisposable disposable = o as IDisposable; - if (disposable != null) - { - try - { - disposable.Dispose(); - } - catch (Exception) { } - } - }); - Clear(); - } - } - - public abstract class CacheInterceptor : IBuildInterceptor - { - private IBuildPolicy _innerPolicy = new BuildPolicy(); - - #region IBuildInterceptor Members - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set { _innerPolicy = value; } - } - - protected ObjectCache buildNewCache() - { - return new ObjectCache(_innerPolicy); - } - - protected abstract ObjectCache findCache(); - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - var key = new InstanceKey{Instance = instance, PluginType = pluginType, Session = buildSession}; - return findCache()[key]; - } - - public IBuildPolicy Clone() - { - CacheInterceptor clonedCache = clone(); - clonedCache.InnerPolicy = _innerPolicy.Clone(); - - return clonedCache; - } - - public void EjectAll() - { - ejectAll(); - _innerPolicy.EjectAll(); - } - - protected virtual void ejectAll() - { - } - - #endregion - - protected abstract CacheInterceptor clone(); - - public override string ToString() - { - return GetType().FullName + " / " + _innerPolicy; - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,59 +0,0 @@ -using System; -using System.Collections; -using System.Web; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public class HttpContextBuildPolicy : CacheInterceptor - { - public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; - - - public static bool HasContext() - { - return HttpContext.Current != null; - } - - public static void DisposeAndClearAll() - { - new HttpContextBuildPolicy().findCache().DisposeAndClear(); - } - - protected override ObjectCache findCache() - { - IDictionary items = findHttpDictionary(); - - if (!items.Contains(ITEM_NAME)) - { - lock (items.SyncRoot) - { - if (!items.Contains(ITEM_NAME)) - { - ObjectCache cache = buildNewCache(); - items.Add(ITEM_NAME, cache); - - return cache; - } - } - } - - return (ObjectCache) items[ITEM_NAME]; - } - - protected virtual IDictionary findHttpDictionary() - { - return HttpContext.Current.Items; - } - - protected override CacheInterceptor clone() - { - return this; - } - - public override string ToString() - { - return InstanceScope.HttpContext.ToString(); - } - } -} Added: trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpSessionLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,13 @@ +using System.Collections; +using System.Web; + +namespace StructureMap.Pipeline +{ + public class HttpSessionLifecycle : HttpContextLifecycle + { + protected override IDictionary findHttpDictionary() + { + return new SessionWrapper(HttpContext.Current.Session); + } + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,74 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public abstract class HttpBuildPolicyBase<HTTP, NONHTTP> : IBuildInterceptor - where HTTP : IBuildInterceptor, new() - where NONHTTP : IBuildInterceptor, new() - { - private readonly IBuildInterceptor _http; - private readonly IBuildInterceptor _nonHttp; - - public HttpBuildPolicyBase() - { - _http = new HTTP(); - _nonHttp = new NONHTTP(); - } - - - private IBuildPolicy _innerPolicy; - - - private IBuildInterceptor interceptor - { - get - { - return HttpContextBuildPolicy.HasContext() - ? _http - : _nonHttp; - } - } - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set - { - _http.InnerPolicy = value; - _nonHttp.InnerPolicy = value; - _innerPolicy = value; - } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - return interceptor.Build(buildSession, pluginType, instance); - } - - public abstract IBuildPolicy Clone(); - public void EjectAll() - { - _http.EjectAll(); - _nonHttp.EjectAll(); - } - } - - - - - - public class HybridBuildPolicy : HttpBuildPolicyBase<HttpContextBuildPolicy, ThreadLocalStoragePolicy> - { - public override IBuildPolicy Clone() - { - return new HybridBuildPolicy(){InnerPolicy = InnerPolicy.Clone()}; - } - - public override string ToString() - { - return InstanceScope.Hybrid.ToString(); - } - } - -} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,7 @@ +namespace StructureMap.Pipeline +{ + public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> + { + + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/IBuildInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,10 +0,0 @@ -namespace StructureMap.Pipeline -{ - /// <summary> - /// Plugin interface to create custom build or lifecycle policies for a Plugin Type - /// </summary> - public interface IBuildInterceptor : IBuildPolicy - { - IBuildPolicy InnerPolicy { get; set; } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,15 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - /// <summary> - /// An object that specifies a "Policy" about how Instance's are invoked. - /// </summary> - [Obsolete("Kill!")] - public interface IBuildPolicy - { - object Build(BuildSession buildSession, Type pluginType, Instance instance); - IBuildPolicy Clone(); - void EjectAll(); - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Lifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -9,6 +9,12 @@ public interface IObjectCache { object Locker { get; } + + int Count + { + get; + } + object Get(Type pluginType, Instance instance); void Set(Type pluginType, Instance instance, object value); void DisposeAndClear(); @@ -21,6 +27,11 @@ get { return new object(); } } + public int Count + { + get { return 0; } + } + public object Get(Type pluginType, Instance instance) { return null; @@ -47,6 +58,11 @@ get { return _locker; } } + public int Count + { + get { return _objects.Count; } + } + public object Get(Type pluginType, Instance instance) { var key = new InstanceKey(instance, pluginType); @@ -95,6 +111,9 @@ { switch (scope) { + case InstanceScope.PerRequest: + return null; + case InstanceScope.Singleton: return new SingletonLifecycle(); @@ -133,7 +152,7 @@ public object Resolve(Type pluginType, Instance instance, BuildSession session) { - var cache = FindCache(instance, session); + var cache = FindCache(pluginType, instance, session); lock (cache.Locker) { var returnValue = cache.Get(pluginType, instance); @@ -171,9 +190,12 @@ } - public IObjectCache FindCache(Instance instance, BuildSession session) + public IObjectCache FindCache(Type pluginType, Instance instance, BuildSession session) { - throw new NotImplementedException(); + var lifecycle = _pipeline.ForType(pluginType).Lifecycle; + return lifecycle == null + ? _defaultCache + : lifecycle.FindCache(); } } } \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,54 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - [Obsolete("Kill!")] - public class SingletonPolicy : CacheInterceptor - { - private readonly object _locker = new object(); - private ObjectCache _cache; - - protected override ObjectCache findCache() - { - if (_cache == null) - { - lock (_locker) - { - if (_cache == null) - { - _cache = buildNewCache(); - } - } - } - - return _cache; - } - - public ObjectCache Cache - { - get - { - return findCache(); - } - } - - protected override void ejectAll() - { - lock (_locker) - { - _cache.DisposeAndClear(); - } - } - - protected override CacheInterceptor clone() - { - return new SingletonPolicy(); - } - - public override string ToString() - { - return InstanceScope.Singleton.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/ThreadLocalStoragePolicy.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,46 +0,0 @@ -using System; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public class ThreadLocalStoragePolicy : CacheInterceptor - { - [ThreadStatic] private static ObjectCache _cache; - private readonly object _locker = new object(); - - public static void DisposeAndClearAll() - { - _cache.DisposeAndClear(); - } - - private void guaranteeHashExists() - { - if (_cache == null) - { - lock (_locker) - { - if (_cache == null) - { - _cache = buildNewCache(); - } - } - } - } - - protected override ObjectCache findCache() - { - guaranteeHashExists(); - return _cache; - } - - protected override CacheInterceptor clone() - { - return this; - } - - public override string ToString() - { - return InstanceScope.Hybrid.ToString(); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,46 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - /// <summary> - /// Makes sure that every request for this object returns a unique object - /// </summary> - public class UniquePerRequestInterceptor : IBuildInterceptor - { - - #region IBuildInterceptor Members - - private IBuildPolicy _innerPolicy = new BuildPolicy(); - - public IBuildPolicy InnerPolicy - { - get { return _innerPolicy; } - set { _innerPolicy = value; } - } - - #endregion - - #region IBuildPolicy Members - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - //insert a default object creator - buildSession.RegisterDefault(pluginType, () => InnerPolicy.Build(buildSession, pluginType, instance)); - - //build this object for the first time - return buildSession.CreateInstance(pluginType); - } - - public IBuildPolicy Clone() - { - return new UniquePerRequestInterceptor(); - } - - public void EjectAll() - { - InnerPolicy.EjectAll(); - } - - #endregion - } -} Copied: trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs (from rev 234, trunk/Source/StructureMap/Pipeline/UniquePerRequestInterceptor.cs) =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -0,0 +1,55 @@ +using System; + +namespace StructureMap.Pipeline +{ + /// <summary> + /// Makes sure that every request for this object returns a unique object + /// </summary> + public class UniquePerRequestLifecycle : ILifecycle + { + public void EjectAll() + { + + } + + public IObjectCache FindCache() + { + return new NulloObjectCache(); + } + + //#region IBuildInterceptor Members + + //private IBuildPolicy _innerPolicy = new BuildPolicy(); + + //public IBuildPolicy InnerPolicy + //{ + // get { return _innerPolicy; } + // set { _innerPolicy = value; } + //} + + //#endregion + + //#region IBuildPolicy Members + + //public object Build(BuildSession buildSession, Type pluginType, Instance instance) + //{ + // //insert a default object creator + // buildSession.RegisterDefault(pluginType, () => InnerPolicy.Build(buildSession, pluginType, instance)); + + // //build this object for the first time + // return buildSession.CreateInstance(pluginType); + //} + + //public IBuildPolicy Clone() + //{ + // return new UniquePerRequestInterceptor(); + //} + + //public void EjectAll() + //{ + // InnerPolicy.EjectAll(); + //} + + //#endregion + } +} Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -75,7 +75,7 @@ { Default = _profileManager.GetDefault(factory.PluginType), PluginType = factory.PluginType, - Policy = factory.Policy, + Lifecycle = factory.Lifecycle, Instances = factory.Instances }; } Modified: trunk/Source/StructureMap/PluginTypeConfiguration.cs =================================================================== --- trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/PluginTypeConfiguration.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -20,7 +20,7 @@ /// <summary> /// The build "policy" for this PluginType. Used by the WhatDoIHave() diagnostics methods /// </summary> - public IBuildPolicy Policy { get; set; } + public ILifecycle Lifecycle { get; set; } /// <summary> /// All of the <see cref="StructureMap.Pipeline.IInstance">IInstance</see>'s registered Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-04-20 01:47:17 UTC (rev 240) @@ -157,15 +157,10 @@ <Compile Include="InstanceFamily.cs" /> <Compile Include="Interceptors\MatchedTypeInterceptor.cs" /> <Compile Include="PipelineGraph.cs" /> - <Compile Include="Pipeline\BuildPolicy.cs" /> - <Compile Include="Pipeline\CacheInterceptor.cs" /> <Compile Include="Pipeline\ConfiguredInstance.cs" /> <Compile Include="Pipeline\ConfiguredInstance.Expressions.cs" /> <Compile Include="Pipeline\ConstructorInstance.cs" /> <Compile Include="Pipeline\DefaultInstance.cs" /> - <Compile Include="Pipeline\HybridBuildPolicy.cs" /> - <Compile Include="Pipeline\IBuildInterceptor.cs" /> - <Compile Include="Pipeline\IBuildPolicy.cs" /> <Compile Include="Pipeline\IConfiguredInstance.cs" /> <Compile Include="Pipeline\ILocationPolicy.cs" /> <Compile Include="Pipeline\Instance.cs" /> @@ -175,8 +170,6 @@ <Compile Include="Pipeline\ProfileManager.cs" /> <Compile Include="Pipeline\PrototypeInstance.cs" /> <Compile Include="Pipeline\ReferencedInstance.cs" /> - <Compile Include="Pipeline\SingletonPolicy.cs" /> - <Compile Include="Pipeline\ThreadLocalStoragePolicy.cs" /> <Compile Include="Pipeline\UserControlInstance.cs" /> <Compile Include="Properties\AssemblyInfo.cs"> <SubType>Code</SubType> @@ -409,12 +402,13 @@ <Compile Include="Pipeline\ConditionalInstance.cs" /> <Compile Include="Pipeline\HttpContextLifecycle.cs" /> <Compile Include="Pipeline\HttpLifecycleBase.cs" /> - <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> + <Compile Include="Pipeline\HttpSessionLifecycle.cs" /> + <Compile Include="Pipeline\HybridSessionLifecycle.cs" /> <Compile Include="Pipeline\Lifecycle.cs" /> <Compile Include="Pipeline\SessionWrapper.cs" /> <Compile Include="Pipeline\SingletonLifecycle.cs" /> <Compile Include="Pipeline\ThreadLocalStorageLifecycle.cs" /> - <Compile Include="Pipeline\UniquePerRequestInterceptor.cs" /> + <Compile Include="Pipeline\UniquePerRequestLifecycle.cs" /> <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> @@ -422,7 +416,6 @@ <Compile Include="Pipeline\BuildFrame.cs" /> <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> - <Compile Include="Pipeline\HttpContextBuildPolicy.cs" /> <Compile Include="Pipeline\InstanceKey.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> <Compile Include="Pipeline\PropertyExpression.cs" /> Modified: trunk/Source/StructureMap/SystemRegistry.cs =================================================================== --- trunk/Source/StructureMap/SystemRegistry.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap/SystemRegistry.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -9,7 +9,7 @@ { public SystemRegistry() { - addExpression(graph => graph.AddType(typeof(MementoSource), typeof(XmlFileMementoSource), "XmlFile")); + addExpression(graph => graph.AddType(typeof (MementoSource), typeof (XmlFileMementoSource), "XmlFile")); ForRequestedType<MementoSource>().TheDefaultIsConcreteType<MemoryMementoSource>(); AddMementoSourceType<DirectoryXmlMementoSource>("DirectoryXml"); @@ -19,23 +19,23 @@ AddMementoSourceType<XmlAttributeFileMementoSource>("XmlAttributeFile"); AddMementoSourceType<XmlFileMementoSource>("XmlFile"); + AddLifecycleType<SingletonLifecycle>(InstanceScope.Singleton); + AddLifecycleType<HttpContextLifecycle>(InstanceScope.HttpContext); + AddLifecycleType<HttpSessionLifecycle>(InstanceScope.HttpSession); + AddLifecycleType<HybridLifecycle>(InstanceScope.Hybrid); + AddLifecycleType<HybridSessionLifecycle>(InstanceScope.HybridHttpSession); + AddLifecycleType<ThreadLocalStorageLifecycle>(InstanceScope.ThreadLocal); + } - AddInterceptorType<SingletonPolicy>(InstanceScope.Singleton); - AddInterceptorType<ThreadLocalStoragePolicy>(InstanceScope.ThreadLocal); - AddInterceptorType<HttpContextBuildPolicy>(InstanceScope.HttpContext); - AddInterceptorType<HttpSessionBuildPolicy>(InstanceScope.HttpSession); - AddInterceptorType<HybridBuildPolicy>(InstanceScope.Hybrid); + private void AddLifecycleType<T>(InstanceScope scope) where T : ILifecycle + { + addExpression(graph => graph.AddType(typeof(ILifecycle), typeof(T), scope.ToString())); } private void AddMementoSourceType<T>(string name) { - addExpression(graph => graph.AddType(typeof(MementoSource), typeof(T), name)); + addExpression(graph => graph.AddType(typeof (MementoSource), typeof (T), name)); } - - private void AddInterceptorType<T>(InstanceScope scope) - { - addExpression(graph => graph.AddType(typeof(IBuildInterceptor), typeof(T), scope.ToString())); - } } } \ No newline at end of file Modified: trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs =================================================================== --- trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -37,7 +37,7 @@ instances.Add(buildInstanceDetail(instance)); } - var pluginTypeDetail = new PluginTypeDetail(pluginType.PluginType, pluginType.Policy.GetType(), instances.ToArray()); + var pluginTypeDetail = new PluginTypeDetail(pluginType.PluginType, pluginType.Lifecycle.GetType(), instances.ToArray()); pluginTypeDetails.Add(pluginTypeDetail); } Modified: trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs =================================================================== --- trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -12,7 +12,7 @@ [Test] public void can_serialize_container_details() { - var pluginTypeDetails = new[]{ new PluginTypeDetail(typeof(string), typeof(BuildPolicy), new[]{ new InstanceDetail("First", "First Instance", typeof(string)), }) }; + var pluginTypeDetails = new[]{ new PluginTypeDetail(typeof(string), typeof(object), new[]{ new InstanceDetail("First", "First Instance", typeof(string)), }) }; var wrapper = new ContainerDetail(new[]{"config"}, pluginTypeDetails); var binaryFormatter = new BinaryFormatter(); Stream stream = new MemoryStream(); Modified: trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Attributes/PluginFamilyAttributeTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -19,7 +19,7 @@ var family = new PluginFamily(typeof (TypeThatDoesNotHaveCustomMementoSource)); att.Configure(family); - Assert.IsInstanceOfType(interceptorType, family.Policy); + Assert.IsInstanceOfType(interceptorType, family.Lifecycle); } [PluginFamily] @@ -120,10 +120,10 @@ [Test] public void ScopeToInterceptorTypes() { - assertScopeLeadsToInterceptor(InstanceScope.HttpContext, typeof (HttpContextBuildPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.Hybrid, typeof (HybridBuildPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.Singleton, typeof (SingletonPolicy)); - assertScopeLeadsToInterceptor(InstanceScope.ThreadLocal, typeof (ThreadLocalStoragePolicy)); + assertScopeLeadsToInterceptor(InstanceScope.HttpContext, typeof (HttpContextLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.Hybrid, typeof (HybridLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.Singleton, typeof (SingletonLifecycle)); + assertScopeLeadsToInterceptor(InstanceScope.ThreadLocal, typeof (ThreadLocalStorageLifecycle)); } [Test] Modified: trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -1,25 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; +using NUnit.Framework; using StructureMap.Attributes; using StructureMap.Testing.Widget3; namespace StructureMap.Testing.Bugs { - [TestFixture] - public class SpecifyScopeInConfigureTester + [TestFixture] public class SpecifyScopeInConfigureTester { - [Test] - public void specify_the_scope_in_a_Configure_if_it_is_not_already_set() + [Test] public void specify_the_scope_in_a_Configure_if_it_is_not_already_set() { var container = new Container(x => { }); container.Configure(x => { x.ForRequestedType<IGateway>().CacheBy(InstanceScope.Singleton) .TheDefaultIsConcreteType<DefaultGateway>(); - }); var gateway1 = container.GetInstance<IGateway>(); @@ -30,4 +23,4 @@ gateway1.ShouldBeTheSameAs(gateway3); } } -} +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -110,7 +110,8 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (ThreadLocalStoragePolicy), family.Policy); + + family.Lifecycle.ShouldBeOfType<ThreadLocalStorageLifecycle>(); } @@ -136,7 +137,7 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); + family.Lifecycle.ShouldBeNull(); } [Test] @@ -149,7 +150,7 @@ PluginGraph pluginGraph = registry.Build(); PluginFamily family = pluginGraph.FindFamily(typeof (IGateway)); - Assert.IsInstanceOfType(typeof (SingletonPolicy), family.Policy); + family.Lifecycle.ShouldBeOfType<SingletonLifecycle>(); } [Test] @@ -198,14 +199,14 @@ [Test] public void PutAnInterceptorIntoTheInterceptionChainOfAPluginFamilyInTheDSL() { - var factoryInterceptor = new StubbedInstanceFactoryInterceptor(); + var lifecycle = new StubbedLifecycle(); var registry = new Registry(); - registry.BuildInstancesOf<IGateway>().InterceptConstructionWith(factoryInterceptor); + registry.BuildInstancesOf<IGateway>().LifecycleIs(lifecycle); PluginGraph pluginGraph = registry.Build(); - Assert.AreSame(pluginGraph.FindFamily(typeof (IGateway)).Policy, factoryInterceptor); + pluginGraph.FindFamily(typeof (IGateway)).Lifecycle.ShouldBeTheSameAs(lifecycle); } [Test] @@ -270,31 +271,16 @@ } } - public class StubbedInstanceFactoryInterceptor : IBuildInterceptor + public class StubbedLifecycle : ILifecycle { - #region IBuildInterceptor Members - - public IBuildPolicy InnerPolicy + public void EjectAll() { - get { throw new NotImplementedException(); } - set { } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { throw new NotImplementedException(); } - public IBuildPolicy Clone() + public IObjectCache FindCache() { throw new NotImplementedException(); } - - public void EjectAll() - { - throw new System.NotImplementedException(); - } - - #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -41,34 +41,7 @@ } } - public class TestingBuildPolicy : IBuildInterceptor - { - #region IBuildInterceptor Members - public IBuildPolicy InnerPolicy - { - get { throw new NotImplementedException(); } - set { } - } - - public object Build(BuildSession buildSession, Type pluginType, Instance instance) - { - throw new NotImplementedException(); - } - - public IBuildPolicy Clone() - { - throw new NotImplementedException(); - } - - public void EjectAll() - { - throw new System.NotImplementedException(); - } - - #endregion - } - public interface IRepository<T> { void Save(T subject); @@ -188,17 +161,6 @@ } [Test] - public void Intercept_construction_with() - { - var registry = new Registry(); - var policy = new TestingBuildPolicy(); - registry.ForRequestedType(typeof (ITarget)).InterceptConstructionWith(policy); - PluginGraph graph = registry.Build(); - - Assert.AreSame(policy, graph.FindFamily(typeof (ITarget)).Policy); - } - - [Test] public void On_creation() { ITarget created = null; @@ -219,7 +181,7 @@ registry.ForRequestedType(typeof (ITarget)).CacheBy(InstanceScope.ThreadLocal); PluginGraph graph = registry.Build(); - Assert.IsInstanceOfType(typeof (ThreadLocalStoragePolicy), graph.FindFamily(typeof (ITarget)).Policy); + graph.FindFamily(typeof (ITarget)).Lifecycle.ShouldBeOfType<ThreadLocalStorageLifecycle>(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/FamilyParserTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -44,19 +44,21 @@ private Type thePluginType; private PluginGraph _graph; - private void assertThatTheFamilyPolicyIs<T>() + private void assertThatTheFamilyLifecycleIs<T>() { _parser.ParseFamily(_familyElement); PluginFamily family = _graph.FindFamily(thePluginType); - Assert.IsInstanceOfType(typeof (T), family.Policy); + Assert.IsInstanceOfType(typeof (T), family.Lifecycle); } [Test] public void ScopeIsBlank() { - assertThatTheFamilyPolicyIs<BuildPolicy>(); + _parser.ParseFamily(_familyElement); + + _graph.FindFamily(thePluginType).Lifecycle.ShouldBeNull(); } @@ -64,7 +66,9 @@ public void ScopeIsBlank2() { _familyElement.SetAttribute(XmlConstants.SCOPE, ""); - assertThatTheFamilyPolicyIs<BuildPolicy>(); + _parser.ParseFamily(_familyElement); + + _graph.FindFamily(thePluginType).Lifecycle.ShouldBeNull(); } @@ -72,7 +76,7 @@ public void ScopeIsSingleton() { _familyElement.SetAttribute(XmlConstants.SCOPE, InstanceScope.Singleton.ToString()); - assertThatTheFamilyPolicyIs<SingletonPolicy>(); + assertThatTheFamilyLifecycleIs<SingletonLifecycle>(); } @@ -80,7 +84,7 @@ public void ScopeIsThreadLocal() { _familyElement.SetAttribute(XmlConstants.SCOPE, InstanceScope.ThreadLocal.ToString()); - assertThatTheFamilyPolicyIs<ThreadLocalStoragePolicy>(); + assertThatTheFamilyLifecycleIs<ThreadLocalStorageLifecycle>(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2009-04-19 23:48:02 UTC (rev 239) +++ trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2009-04-20 01:47:17 UTC (rev 240) @@ -3,6 +3,7 @@ using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Source; using StructureMap.Testing.Widget3; namespace StructureMap.Testing.Configuration @@ -57,14 +58,18 @@ [Test] public void Create_system_object_successfully_and_call_the_requested_action() { - var memento = new MemoryInstanceMemento("Singleton", "anything"); + var memento = new MemoryInstanceMemento("XmlFile", "anything"); + memento.SetProperty("FilePath", "something"); + memento.SetProperty("XPath", "nodeName"); + memento.SetProperty("NodeName", "something"); + bool iWasCalled = false; var builder = new GraphBuilder(new Registry[0]); - builder.WithSystemObject<IBuildInterceptor>(memento, "singleton", policy => + builder.WithSystemObject<MementoSource>(memento, "some xml", policy => { - Assert.IsInstanceOfType(typeof (SingletonPolicy), policy); + Assert.IsInstanceOfType(typeof(XmlFileMementoSource), policy); iWasCalled = true; }); Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMa... [truncated message content] |