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