2011-09-29 28 views
3

我有一个工厂和部件在温莎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左右,每个请求)的情况下,没有被释放或被称为处置方法。

我从这里的文档假设: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!") 
    } 
} 

然后按预期我的部件得到释放。任何关于这是一个错误还是我错误理解某些东西的建议。我的解决方案在一天结束时运行,但并不像我希望的那么好。

+0

这听起来不对。如果你能在Windsor 3上重现相同的行为,你可以试试吗? –

+0

嗨Krzysztof我在温莎3试过了,它按预期工作。然而它在Windsor 2.5.3中也失败了。我把测试放在这里(有2个分支:https://github.com/amarraja/WindsorFactories)。我为了升级项目太晚了,您是否发现上述解决方法有问题?谢谢您的帮助! – amarsuperstar

+0

欢呼声。下班后我会看看。 –

回答

2

继主要问题下面的评论,Krzysztof发布了一个更新来解决这个问题在温莎。如果你看到这些问题,那么无论是升级到2.5.4还是更好,如果可以的话,温莎3。