|
From: <jer...@us...> - 2009-07-14 15:03:20
|
Revision: 255
http://structuremap.svn.sourceforge.net/structuremap/?rev=255&view=rev
Author: jeremydmiller
Date: 2009-07-14 15:03:08 +0000 (Tue, 14 Jul 2009)
Log Message:
-----------
memory lead fixes
Modified Paths:
--------------
trunk/Source/StructureMap/Container.cs
trunk/Source/StructureMap/IInstanceFactory.cs
trunk/Source/StructureMap/InstanceFactory.cs
trunk/Source/StructureMap/Pipeline/LiteralInstance.cs
trunk/Source/StructureMap/Pipeline/ProfileManager.cs
trunk/Source/StructureMap/PipelineGraph.cs
trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs
Modified: trunk/Source/StructureMap/Container.cs
===================================================================
--- trunk/Source/StructureMap/Container.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/Container.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -459,7 +459,7 @@
public void Dispose()
{
_transientCache.DisposeAndClear();
- _pipelineGraph.ClearAll();
+ _pipelineGraph.Dispose();
}
#endregion
Modified: trunk/Source/StructureMap/IInstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/IInstanceFactory.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/IInstanceFactory.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -9,7 +9,7 @@
/// <summary>
/// Interface for a "Factory" pattern class that creates object instances of the PluginType
/// </summary>
- public interface IInstanceFactory
+ public interface IInstanceFactory : IDisposable
{
Type PluginType { get; }
@@ -27,7 +27,7 @@
Instance FindInstance(string name);
void ImportFrom(PluginFamily family);
- [Obsolete("Kill!!!!")]
+
void EjectAllInstances();
ILifecycle Lifecycle {get; }
Modified: trunk/Source/StructureMap/InstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/InstanceFactory.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/InstanceFactory.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -146,5 +146,10 @@
}
#endregion
+
+ public void Dispose()
+ {
+ _instances.Clear();
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Pipeline/LiteralInstance.cs
===================================================================
--- trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -3,9 +3,9 @@
namespace StructureMap.Pipeline
{
- public class LiteralInstance : ExpressedInstance<LiteralInstance>
+ public class LiteralInstance : ExpressedInstance<LiteralInstance>, IDisposable
{
- private readonly object _object;
+ private object _object;
public LiteralInstance(object anObject)
{
@@ -48,5 +48,10 @@
{
return string.Format("LiteralInstance: {0}", _object);
}
+
+ public void Dispose()
+ {
+ _object = null;
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs
===================================================================
--- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -5,7 +5,7 @@
namespace StructureMap.Pipeline
{
- public class ProfileManager
+ public class ProfileManager : IDisposable
{
private readonly Profile _default = new Profile("");
private readonly object _locker = new object();
@@ -246,7 +246,7 @@
}
}
- public void ClearAll()
+ public void Dispose()
{
_currentProfile.Clear();
_machineProfile.Clear();
Modified: trunk/Source/StructureMap/PipelineGraph.cs
===================================================================
--- trunk/Source/StructureMap/PipelineGraph.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap/PipelineGraph.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -10,7 +10,7 @@
public delegate InstanceFactory MissingFactoryFunction(Type pluginType, ProfileManager profileManager);
- public class PipelineGraph
+ public class PipelineGraph : IDisposable
{
private readonly Dictionary<Type, IInstanceFactory> _factories
= new Dictionary<Type, IInstanceFactory>();
@@ -54,11 +54,15 @@
_missingFactory = _missingFactory
};
+
+
foreach (var pair in _factories)
{
- clone._factories.Add(pair.Key, pair.Value);
+ clone._factories.Add(pair.Key, pair.Value.Clone());
}
+ clone.EjectAllInstancesOf<IContainer>();
+
return clone;
}
@@ -232,10 +236,26 @@
return ForType(pluginType).FindInstance(instanceKey) != null;
}
- public void ClearAll()
+ public void Dispose()
{
+ if (_factories.ContainsKey(typeof(IContainer)))
+ {
+ foreach (var instance in _factories[typeof(IContainer)].AllInstances)
+ {
+ IDisposable disposable = instance as IDisposable;
+ if (disposable != null)
+ {
+ disposable.Dispose();
+ }
+ }
+ }
+
+ foreach (var factory in _factories)
+ {
+ factory.Value.Dispose();
+ }
_factories.Clear();
- _profileManager.ClearAll();
+ _profileManager.Dispose();
_genericsGraph.ClearAll();
}
}
Modified: trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-07-07 19:00:49 UTC (rev 254)
+++ trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-07-14 15:03:08 UTC (rev 255)
@@ -28,6 +28,33 @@
}
[Test]
+ public void disposing_the_child_container_does_not_affect_the_parent_container()
+ {
+ var container = new Container(x =>
+ {
+ x.Scan(o =>
+ {
+ o.TheCallingAssembly();
+ o.AddAllTypesOf<IBar>();
+ });
+ });
+
+ container.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0);
+
+ using (var nested = container.GetNestedContainer())
+ {
+ nested.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0);
+ }
+
+ container.GetAllInstances<IBar>().Count.ShouldBeGreaterThan(0);
+ }
+
+ public interface IBar{}
+ public class AFoo : IBar{}
+ public class BFoo : IBar{}
+ public class CFoo : IBar{}
+
+ [Test]
public void transient_service_in_the_parent_container_is_effectively_a_singleton_for_the_nested_container()
{
var parent = new Container(x =>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|