From: <jer...@us...> - 2009-04-19 23:48:14
|
Revision: 239 http://structuremap.svn.sourceforge.net/structuremap/?rev=239&view=rev Author: jeremydmiller Date: 2009-04-19 23:48:02 +0000 (Sun, 19 Apr 2009) Log Message: ----------- just about to HACK, HACK, HACK!!!! Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/BuildPolicy.cs trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs trunk/Source/StructureMap/Pipeline/InstanceKey.cs trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs trunk/Source/StructureMap/Pipeline/Lifecycle.cs trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/BuildSession.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -161,6 +161,7 @@ return _defaults[pluginType](); } + [Obsolete("get this inlined")] public virtual object ApplyInterception(Type pluginType, object actualValue) { if (actualValue == null) return null; Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -87,6 +87,7 @@ } } + [Obsolete("Kill!")] public void AddInterceptor(IBuildInterceptor interceptor) { interceptor.InnerPolicy = _buildPolicy; Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -13,6 +13,8 @@ { Type PluginType { get; } IEnumerable<IInstance> Instances { get; } + + [Obsolete("Kill!!!!")] IBuildPolicy Policy { get; } Instance MissingInstance { get; set; } @@ -27,12 +29,18 @@ [Obsolete("Return the list of Instances instead")] IList GetAllInstances(BuildSession session); + [Obsolete("Kill!!!!")] object Build(BuildSession session, Instance instance); + Instance FindInstance(string name); void ImportFrom(PluginFamily family); + + [Obsolete("Kill!!!!")] void EjectAllInstances(); + ILifecycle Lifecycle {get; } + } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/InstanceFactory.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -95,6 +95,7 @@ } } + [Obsolete("Kill!!!!")] public IBuildPolicy Policy { get { return _policy; } @@ -132,6 +133,7 @@ return list; } + [Obsolete("Kill!!!!")] public object Build(BuildSession session, Instance instance) { return _policy.Build(session, PluginType, instance); @@ -164,6 +166,11 @@ _instances.Clear(); } + public ILifecycle Lifecycle + { + get { throw new NotImplementedException(); } + } + #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/BuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,7 @@ namespace StructureMap.Pipeline { + [Obsolete("Kill!")] public sealed class BuildPolicy : IBuildPolicy { #region IBuildPolicy Members Modified: trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,10 @@ namespace StructureMap.Pipeline { + + + + [Obsolete("Kill! in favor of MainObjectCache")] public class ObjectCache : Cache<InstanceKey, object> { public ObjectCache(IBuildPolicy innerPolicy) : base(key => innerPolicy.Build(key.Session, key.PluginType, key.Instance)) Modified: trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HttpContextBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Web; using StructureMap.Attributes; Added: trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,53 @@ +using System.Collections; +using System.Web; + +namespace StructureMap.Pipeline +{ + public class HttpContextLifecycle : ILifecycle + { + public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; + + + public static bool HasContext() + { + return HttpContext.Current != null; + } + + public static void DisposeAndClearAll() + { + new HttpContextLifecycle().FindCache().DisposeAndClear(); + } + + public void EjectAll() + { + FindCache().DisposeAndClear(); + } + + public IObjectCache FindCache() + { + IDictionary items = findHttpDictionary(); + + if (!items.Contains(ITEM_NAME)) + { + lock (items.SyncRoot) + { + if (!items.Contains(ITEM_NAME)) + { + MainObjectCache cache = new MainObjectCache(); + items.Add(ITEM_NAME, cache); + + return cache; + } + } + } + + return (IObjectCache)items[ITEM_NAME]; + } + + + protected virtual IDictionary findHttpDictionary() + { + return HttpContext.Current.Items; + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/HttpLifecycleBase.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,33 @@ +namespace StructureMap.Pipeline +{ + public abstract class HttpLifecycleBase<HTTP, NONHTTP> : ILifecycle + where HTTP : ILifecycle, new() + where NONHTTP : ILifecycle, new() + { + private readonly ILifecycle _http; + private readonly ILifecycle _nonHttp; + + public HttpLifecycleBase() + { + _http = new HTTP(); + _nonHttp = new NONHTTP(); + } + + public void EjectAll() + { + _http.EjectAll(); + _nonHttp.EjectAll(); + } + + public IObjectCache FindCache() + { + return HttpContextLifecycle.HasContext() + ? _http.FindCache() + : _nonHttp.FindCache(); + } + } + + public class HybridLifecycle : HttpLifecycleBase<HttpContextLifecycle, ThreadLocalStorageLifecycle> + { + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Web; using StructureMap.Attributes; @@ -17,6 +18,20 @@ } } + + public class HttpSessionLifecycle : HttpContextLifecycle + { + protected override IDictionary findHttpDictionary() + { + return new SessionWrapper(HttpContext.Current.Session); + } + } + + public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> + { + + } + public class HybridSessionBuildPolicy : HttpBuildPolicyBase<HttpSessionBuildPolicy, ThreadLocalStoragePolicy> { public override IBuildPolicy Clone() Modified: trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -55,6 +55,9 @@ } + + + public class HybridBuildPolicy : HttpBuildPolicyBase<HttpContextBuildPolicy, ThreadLocalStoragePolicy> { public override IBuildPolicy Clone() Modified: trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -5,6 +5,7 @@ /// <summary> /// An object that specifies a "Policy" about how Instance's are invoked. /// </summary> + [Obsolete("Kill!")] public interface IBuildPolicy { object Build(BuildSession buildSession, Type pluginType, Instance instance); Modified: trunk/Source/StructureMap/Pipeline/InstanceKey.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -6,21 +6,29 @@ { public string Name { get; set; } public Type PluginType { get; set; } + [Obsolete("Kill!")] private WeakReference _session; + [Obsolete("Kill!")] private WeakReference _instance; public InstanceKey() { } + public InstanceKey(Instance instance, Type pluginType) + { + Name = instance.Name; + PluginType = pluginType; + } - + [Obsolete("Kill!")] public BuildSession Session { get { return (BuildSession) _session.Target; } set { _session = new WeakReference(value); } } + [Obsolete("Kill!")] public Instance Instance { get Added: trunk/Source/StructureMap/Pipeline/Lifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using StructureMap.Attributes; +using StructureMap.Interceptors; +using StructureMap.Util; + +namespace StructureMap.Pipeline +{ + public interface IObjectCache + { + object Locker { get; } + object Get(Type pluginType, Instance instance); + void Set(Type pluginType, Instance instance, object value); + void DisposeAndClear(); + } + + public class NulloObjectCache : IObjectCache + { + public object Locker + { + get { return new object(); } + } + + public object Get(Type pluginType, Instance instance) + { + return null; + } + + public void Set(Type pluginType, Instance instance, object value) + { + // no-op + } + + public void DisposeAndClear() + { + // no-op + } + } + + public class MainObjectCache : IObjectCache + { + private readonly IDictionary<InstanceKey, object> _objects = new Dictionary<InstanceKey,object>(); + private readonly object _locker = new object(); + + public object Locker + { + get { return _locker; } + } + + public object Get(Type pluginType, Instance instance) + { + var key = new InstanceKey(instance, pluginType); + return _objects.ContainsKey(key) ? _objects[key] : null; + } + + public void Set(Type pluginType, Instance instance, object value) + { + var key = new InstanceKey(instance, pluginType); + _objects.Add(key, value); + } + + public void DisposeAndClear() + { + + lock (Locker) + { + foreach (var @object in _objects.Values) + { + IDisposable disposable = @object as IDisposable; + if (disposable != null) + { + try + { + disposable.Dispose(); + } + catch (Exception) { } + } + } + + _objects.Clear(); + } + } + } + + + public interface ILifecycle + { + void EjectAll(); + IObjectCache FindCache(); + } + + public static class Lifecycles + { + public static ILifecycle GetLifecycle(InstanceScope scope) + { + switch (scope) + { + case InstanceScope.Singleton: + return new SingletonLifecycle(); + + case InstanceScope.HttpContext: + return new HttpContextLifecycle(); + + case InstanceScope.ThreadLocal: + return new ThreadLocalStorageLifecycle(); + + case InstanceScope.Hybrid: + return new HybridLifecycle(); + + case InstanceScope.HttpSession: + return new HttpSessionLifecycle(); + + case InstanceScope.HybridHttpSession: + return new HybridSessionLifecycle(); + } + + throw new ArgumentOutOfRangeException("scope"); + } + } + + public class ObjectBuilder + { + private readonly PipelineGraph _pipeline; + private readonly InterceptorLibrary _library; + private readonly IObjectCache _defaultCache; + + public ObjectBuilder(PipelineGraph pipeline, InterceptorLibrary library, IObjectCache defaultCache) + { + _pipeline = pipeline; + _library = library; + _defaultCache = defaultCache; + } + + public object Resolve(Type pluginType, Instance instance, BuildSession session) + { + var cache = FindCache(instance, session); + lock (cache.Locker) + { + var returnValue = cache.Get(pluginType, instance); + if (returnValue == null) + { + returnValue = ConstructNew(pluginType, instance, session); + + + cache.Set(pluginType, instance, returnValue); + } + + return returnValue; + } + } + + public object ConstructNew(Type pluginType, Instance instance, BuildSession session) + { + object returnValue = instance.Build(pluginType, session); + return ApplyInterception(pluginType, returnValue, session, instance); + } + + public virtual object ApplyInterception(Type pluginType, object actualValue, BuildSession session, Instance instance) + { + if (actualValue == null) return null; + + try + { + return _library.FindInterceptor(actualValue.GetType()).Process(actualValue, session); + } + catch (Exception e) + { + throw new StructureMapException(308, e, instance.Name, actualValue.GetType()); + } + + + } + + public IObjectCache FindCache(Instance instance, BuildSession session) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/SingletonLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,17 @@ +namespace StructureMap.Pipeline +{ + public class SingletonLifecycle : ILifecycle + { + private readonly MainObjectCache _cache = new MainObjectCache(); + + public void EjectAll() + { + _cache.DisposeAndClear(); + } + + public IObjectCache FindCache() + { + return _cache; + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Pipeline/SingletonPolicy.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -3,6 +3,7 @@ namespace StructureMap.Pipeline { + [Obsolete("Kill!")] public class SingletonPolicy : CacheInterceptor { private readonly object _locker = new object(); Added: trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,37 @@ +using System; + +namespace StructureMap.Pipeline +{ + public class ThreadLocalStorageLifecycle : ILifecycle + { + private readonly object _locker = new object(); + + [ThreadStatic] + private static MainObjectCache _cache; + + public void EjectAll() + { + FindCache().DisposeAndClear(); + } + + public IObjectCache FindCache() + { + guaranteeHashExists(); + return _cache; + } + + private void guaranteeHashExists() + { + if (_cache == null) + { + lock (_locker) + { + if (_cache == null) + { + _cache = new MainObjectCache(); + } + } + } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-04-19 23:48:02 UTC (rev 239) @@ -407,8 +407,13 @@ <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IContext.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> + <Compile Include="Pipeline\HttpContextLifecycle.cs" /> + <Compile Include="Pipeline\HttpLifecycleBase.cs" /> <Compile Include="Pipeline\HttpSessionBuildPolicy.cs" /> + <Compile Include="Pipeline\Lifecycle.cs" /> <Compile Include="Pipeline\SessionWrapper.cs" /> + <Compile Include="Pipeline\SingletonLifecycle.cs" /> + <Compile Include="Pipeline\ThreadLocalStorageLifecycle.cs" /> <Compile Include="Pipeline\UniquePerRequestInterceptor.cs" /> <Compile Include="TypeExtensions.cs" /> <Compile Include="IBootstrapper.cs" /> Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap/Util/Cache.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -38,6 +38,11 @@ _values = dictionary; } + public object Locker + { + get { return _locker; } + } + public Func<KEY, VALUE> OnMissing { set { _onMissing = value; } Added: trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs 2009-04-19 23:48:02 UTC (rev 239) @@ -0,0 +1,33 @@ +using NUnit.Framework; +using Rhino.Mocks; +using StructureMap.Graph; +using StructureMap.Interceptors; +using StructureMap.Pipeline; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] public class ObjectBuilderTester + { + private PluginGraph graph; + private PipelineGraph pipeline; + private InterceptorLibrary library; + private IObjectCache theDefaultCache; + private ObjectBuilder builder; + + [SetUp] public void SetUp() + { + graph = new PluginGraph(); + pipeline = new PipelineGraph(graph); + library = new InterceptorLibrary(); + + theDefaultCache = MockRepository.GenerateMock<IObjectCache>(); + + builder = new ObjectBuilder(pipeline, library, theDefaultCache); + } + + [Test] public void FIRSTTEST() + { + + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 22:07:52 UTC (rev 238) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-04-19 23:48:02 UTC (rev 239) @@ -353,6 +353,7 @@ <Compile Include="Pipeline\InstanceTester.cs" /> <Compile Include="Pipeline\LiteralInstanceTester.cs" /> <Compile Include="Pipeline\MissingInstanceTester.cs" /> + <Compile Include="Pipeline\ObjectBuilderTester.cs" /> <Compile Include="Pipeline\OptionalSetterInjectionTester.cs" /> <Compile Include="Pipeline\ProfileManagerMergeTester.cs" /> <Compile Include="Pipeline\ProfileManagerTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |