温莎型工厂不释放儿童

时间:2011-09-29 12:27:00

标签: c# inversion-of-control castle-windsor

我在Windsor 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!")
   }
}

然后我的组件按预期发布。关于这是一个错误还是我错误理解的任何建议。我的解决方案在一天结束时起作用,但不像我希望的那样好。

1 个答案:

答案 0 :(得分:2)

根据主要问题下面的评论,Krzysztof发布了一个更新,以解决温莎的问题。如果你看到这些问题,那么要么升级到2.5.4甚至更好,如果可以,请升级到Windsor 3.