温莎式工厂不释放儿童
本文关键字:释放 工厂 | 更新日期: 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。