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