1

我正在使用 Castle Windsor 和 DynamicProxy 从头开始​​实现持久性延迟加载(我知道 NHibernate 可能是一个选项等)。我已经实现了一个自定义组件激活器来始终将我的业务类实例化为代理。

我对组件激活器的生活方式有疑问(Castle Windsor 组件激活器的预期生活方式是什么?)。Krzysztof Kozmic 友好地回答说“Windsor 中的每个组件都会有自己的激活器实例”。

面对我的应用程序中的大内存泄漏,我发现永远不会调用此类中的显式析构函数(至少在我的情况下)。Castle 是否适当地释放了激活器,即在处理类型工厂时?

Classes
    .FromAssemblyContaining(typeof(QuantityType))
    .InNamespace(typeof(QuantityType).Namespace)
    .WithService.DefaultInterfaces()
    .Configure(reg => { reg.Activator<ColMsProxyComponentActivator>(); })
    .LifestyleTransient() // We really want new entities every time a new one is requested

附带说明一下,能够显式声明组件激活器的生活方式不是很有用吗?就我而言,它没有理由不能是单例,这样可以节省一些内存和处理。

4

1 回答 1

2

在 Castle Windsor 中感知内存泄漏的最常见原因是误解了如何处理任何没有系统可定义生命周期的组件,尤其是瞬态组件。

城堡的设计者决定创造和破坏的责任都是容器的关注点。在这种情况下,默认行为是跟踪容器创建的所有对象。这意味着,如果您不释放它们,您将看到看起来像内存泄漏的情况。

如果您阅读本文并想“我知道,我知道,我正在发布我所有的东西”,您可能想通过将默认发布策略更改为“不跟踪”来向自己证明您是。如果您的内存泄漏消失了,您可能不会在某处释放某些东西。

我认为这是更改发布政策的代码:

 container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();

如果您正在考虑,我将保留 NoTrackingReleasePolicy,因为它解决了我的问题,这是代码中作者的注释:

 [Obsolete("This class is a hack, will be removed in the future release and should be avoided. Please implement proper lifecycle management instead.")]

如果您不知道它是如何工作的,这里有一个关于释放对象的有用链接

希望这可以帮助

于 2013-11-15T05:08:42.627 回答