Just to help others having the same issue, it is stated clearly in the
documentation at
http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx.
Given you resolved a component from a typed factory:
var component = factory.Create();
You can then pass it as an argument to any of factory's void methods
to have the factory release the component from the container
factory.Destroy(component);
Sorry for the inconvenience.
On 21 Dec., 13:34, Krzysztof Koźmic <[email protected]>
wrote:
> Hi Martin,
>
> in short - this is by design.
>
> The factory is a singleton so disposing it will take no effect.
>
> Also Releasing component directly with the container might have worked
> in previous version but it was due to a flaw in the design.
>
> The factory 'owns' the object and if it was resolved from the factory,
> it ought to be released via the factory.
>
> HTH,
> Krzysztof
>
> On 21/12/2011 12:40 AM, Martin Larsen wrote:
>
>
>
>
>
>
>
> > Hi
>
> > I have found a bug in 3.0.0.2314 of the WindsorContainer. When
> > releasing an object which is created by a factory from the container
> > the object is not garbage collected, thereby creating a memory leak.
> > You can reproduce the bug using the following code:
>
> > namespace MemTest
> > {
> > class Program
> > {
> > private static IWindsorContainer _container;
>
> > static void Main(string[] args)
> > {
> > _container = new WindsorContainer();
> > _container.AddFacility<TypedFactoryFacility>();
>
> > _container.Register(Component.For<IServiceFactory>().AsFactory());
>
> > _container.Register(Component.For<IService>().ImplementedBy<Service>().Life
> > Style.Transient);
>
> > CreateInstanceByResolve();
> > GC.Collect();
> > Console.WriteLine("Done (rosolving)...");
> > Thread.Sleep(1000);
>
> > CreateInstanceByFactory();
> > GC.Collect();
> > Console.WriteLine("Done (factory)...");
> > Thread.Sleep(1000);
>
> > _container.Dispose();
> > GC.Collect();
> > Console.WriteLine("Done (disposing container)...");
> > Thread.Sleep(1000);
>
> > Console.ReadLine();
> > }
>
> > private static void CreateInstanceByResolve()
> > {
> > IService serviceByResolve =
> > _container.Resolve<IService>();
>
> > // This will correctly release the object and garbage
> > collect the object
> > _container.Release(serviceByResolve);
> > }
>
> > private static void CreateInstanceByFactory()
> > {
> > IServiceFactory factory =
> > _container.Resolve<IServiceFactory>();
> > IService serviceByFactory = factory.Create();
>
> > // This will NOT release the object and garbage collection
> > will occur when container is disposed. It does release it in 2.5.3.
> > _container.Release(factory);
>
> > // This will NOT release it either - it worked before?
> > _container.Release(serviceByFactory);
> > }
>
> > }
>
> > public class Service : IService
> > {
> > ~Service()
> > {
> > Console.WriteLine("GC");
> > }
>
> > public void Dispose()
> > {
> > }
> > }
>
> > public interface IService : IDisposable
> > {
> > }
>
> > public interface IServiceFactory
> > {
> > IService Create();
> > }
> > }
>
> > The output of the program is:
>
> > Done (rosolving)...
> > GC
> > Done (factory)...
> > Done (disposing container)...
> > GC
>
> > which shows that the object created by the factory is not garbage
> > collected until the container is disposed. I would have expected the
> > following (which is the case for 2.5.3):
>
> > Done (rosolving)...
> > GC
> > Done (factory)...
> > GC
> > Done (disposing container)...
--
You received this message because you are subscribed to the Google Groups
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.