温莎式工厂不释放儿童

本文关键字:释放 工厂 | 更新日期: 2023-09-27 18:09:58

我有一个工厂和组件注册在温莎2.5.1如下:

interface IFooFactory{
   IFoo CreateFoo();
}
interface IFoo {
   void DoSomething();
}
class ConcreteFoo : IFoo, IDisposable {
   public void Dispose(){
      Log.info("Going now, bye!")
   }
}
container.Register(
   Component.For<IFooFactory>().AsFactory().Lifestyle.PerWebRequest,
   Componenet.For<IFoo>().ImplementedBy<ConcreteFoo>().Lifestyle.Transient
);

但是我注意到的是IFoo的实例(每个请求可能是100左右)没有被释放或调用它们的dispose方法。

我从这里的文档中假设:http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx如果工厂是PerRequest,那么它将释放它在请求结束时创建的对象。

如果我将工厂本身传递给我的组件,并像这样调用释放方法:

interface IFooFactory{
   IFoo CreateFoo();
   void Releaser(IFoo foo);
}
interface IFoo {
   void DoSomething();
}
class ConcreteFoo : IFoo, IDisposable {
   IFooFactory fact;
   public ConcreteFoo(IFooFactory fact)....
   public void DoSomething(){
      fact.Releaser(this);
      //Do the rest
   }
   public void Dispose(){
      Log.info("Going now, bye!")
   }
}

然后我的组件按预期释放。关于这是否是一个错误或我误解的东西的任何建议。我的解决方案在一天结束时有效,但并不像我希望的那样好。

温莎式工厂不释放儿童

在主要问题下面的评论之后,Krzysztof已经发布了一个更新来修复温莎的这个问题。如果你看到这些问题,那么要么升级到2.5.4,或者更好的版本,如果可以的话,升级到Windsor 3。