在Castle Windsor使用临时工厂

时间:2015-01-16 17:00:08

标签: c# castle-windsor factory castle transient

如果您使用Windsor中的TypedFactoryFacility基于接口为您生成工厂,则工厂本身可以注册为Transient。事实证明,工厂将释放它在发布后处理工厂时创建的所有瞬态对象。

container.AddFacility<TypedFactoryFacility>();
container.Register(
    Types.FromThisAssembly().BasedOn<IFactory>().Configure(
        x => x.AsFactory()).LifestyleTransient());

这意味着如果我将自动生成的工厂创建为瞬态,它会让我忘记Release从工厂创建的对象(只要我管理工厂本身的生命周期,当然)。这种瞬态工厂的生命周期将与其他一些瞬态对象相关联,因此当该对象被释放时,工厂将被释放,工厂创建的一切都将被释放。

就个人而言,我讨厌明确地记住Release()个对象,这会清理很多代码,所以这让我很开心。但问题是:这是合理的做法吗?这一切似乎都太容易了。

每次需要工厂时创建新工厂实例是否有缺点?

我是否挖了一个可怕的洞?

2 个答案:

答案 0 :(得分:1)

因此,更深层次的问题与IDisposable有关。你为什么用它?您是否真的跟踪未管理/有限的资源?您是使用它来真正处理某些东西还是作为关闭协议?

如果您更改Windsor的发布政策,所有这些都将消失 - 从而让您在何时/如果[召唤]处理时进行处理。容器试图通过跟踪处理事物的内容和时间来帮助您,但它只能做很多事情,所以有时候提升并接管责任会更好。

另一种选择是关闭跟踪并公开跟踪要处置的事物的服务。这可以更具语义性,并了解您的业务/基础架构需求。

总而言之:您所做的事情很好,但每次您需要工厂创建东西时,实例化瞬态工厂并不常见。请务必记录下您自己的未来。

答案 1 :(得分:1)

Castle中的自动工厂机制基于Castle.DynamicProxy;我想如果你将工厂用作瞬态组件,你必须为每个分辨率的ProxyGenerator付费,除非存在其他一些缓存机制。

documentation警告不要每次重新创建ProxyGenerator

  

如果您有一个漫长的运行过程(网站,Windows服务等)   并且你必须创建许多动态代理,你应该确保   重用相同的ProxyGenerator实例。如果没有,请注意你的意愿   然后绕过缓存机制。副作用是CPU使用率高   内存消耗不断增加

但完全有可能在Windsor中有一些机制可以防止这个问题,或者说文档已经过时了。

我的建议:测试你的瞬态工厂分辨率,然后解决你的组件;密切注意内存(也是加载的程序集;可能代理的代码加载在侧面程序集中)和处理器使用情况,以确定你的技巧是否可行