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.

Reply via email to