在温莎城堡中使用临时工厂

Using transient factories in Castle Windsor

如果你使用Windsor中的TypedFactoryFacility基于接口为你生成工厂,工厂本身可以注册为Transient。事实证明,当工厂本身在释放后被处置时,工厂将释放它创建的所有临时对象。

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

这意味着,如果我将自动生成的工厂创建为瞬态,它可以巧妙地让我忘记 Releaseing 从工厂创建的对象(只要我管理工厂本身的生命周期,当然)。这种瞬态工厂的生命周期将与其他一些瞬态对象相关联,因此当该对象被释放时,工厂将被释放,以及工厂创建的所有内容。

就我个人而言,我讨厌必须记住显式 Release() 对象,这大大清理了代码,所以这让我很高兴。但问题是:这是合理的做法吗?这一切似乎太简单了。

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

我是不是给自己挖了个坑?

所以更深层次的问题与IDisposable有关。你为什么要用它?您真的在跟踪 unmanaged/limited 资源吗?你是用它来真正处理某些东西还是作为关闭协议?

如果您更改 Windsor 的发布政策,所有这些都会消失 - 从而让您负责 when/if [to] 调用处置。容器试图通过跟踪处理什么以及何时处理东西来帮助您,但它只能做这么多,所以有时最好站出来接管责任。

另一种选择是关闭跟踪并公开跟踪要处理的事物的服务。这可以更语义化并理解您的 business/infrastructure 需求。

总而言之:您所做的很好,但是每次需要工厂创建某些东西时都实例化临时工厂并不是那么常见。确保为未来的自己记录下来。

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

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

If you have a long running process (web site, windows service, etc.) and you have to create many dynamic proxies, you should make sure to reuse the same ProxyGenerator instance. If not, be aware that you will then bypass the caching mechanism. Side effects are high CPU usage and constant increase in memory consumption

但是,Windsor 中完全有可能存在某种机制可以防止出现此问题,或者文档已过时。

我的建议:在你的瞬时工厂解析上循环测试,然后解析你的组件;密切关注内存(也加载了程序集;可能代理代码加载到侧面程序集中)和处理器使用情况以确定您的技巧是否可行