繁体   English   中英

温莎城堡-我必须释放单例或非一次性的瞬态对象吗?

[英]Castle Windsor - Do I have to release singleton or non-disposable transient objects?

Castle Wiki说,我应该在几个地方始终调用container.Release()来解决通过容器解析的组件。 对于复杂的生活方式管理技术(例如LifeStyle.Pooled)或使用专用工具时,这显然是有意义的。

但是,我真的必须释放单例(在容器被处置之前一直存在)和非一次性的瞬态对象吗? 如果我逐步执行对临时对象或单例的Release()调用,那么这些调用似乎是多余的-例如,在临时对象未实现IDisposable的情况下,内核仅注意到其没有对象跟踪并返回...

似乎存在“组件负担”的概念,以跟踪对解决瞬态对象时可能构造的其他一次性组件的“间接”引用。 我知道,如果您不知道100%瞬态对象是否具有这种间接依赖关系,则有必要释放它们。 这是“促使”所有Castle用户使用ALWAYS发行组件的主要原因吗?

Castle Wiki在这里有点严格-尝试安全而不是后悔。 它可能在那里使用了一些改写。

无论如何-这是它的工作方式。

Windsor(默认情况下)跟踪大多数组件,并保留对它们的引用,这阻止了Garbage Collector收集它们。 这不是错误-它是一个功能,并且是一个非常有用且功能强大的功能。 在大多数情况下,您不应该假设是否跟踪组件。 具有一次性依赖项的非一次性组件也将被跟踪。 这通常是一条规则:“ 在Windsor中,默认的发布策略将跟踪其某些依赖项本身具有任何停用步骤的组件 ”。

现在,这是终生发挥作用的部分。

  • 单例-根据定义,单例在容器的上下文中是“全局”的-在您首次请求它们时创建它们,并在容器的整个生命周期中生存(这意味着直到容器被处置)。 如果您看到文档,它实际上说释放单例实际上什么也没做。 只有在处理完容器后,才会调用与您的生命周期组件有关的退役问题。

  • 每个(上下文:Web请求/ WCF会话/)-由于对象是在定义明确的上下文中共享的,并且定义的末端明确,因此上下文的结尾将负责释放组件。

  • 瞬态-这是真正的问题所在。由于瞬态组件没有生命周期的任意终点,并且您可以在应用程序的使用期限内生成其实例的堆,因此没有其他方法可以明确地对它们说容器“嘿,我不再使用这个对象了,随时摆脱它,谢谢所有的鱼。”

现在,文档中建议始终发布组件的原因是使用组件的代码不应真正知道组件的寿命。 并非总是如此,并且在应用程序中经常有“自然”适合生活方式的组件。 但是总的来说,就像我说的那样,这是为了安全而不是后悔。

另一件事是您将其称为Resolve and Release 您只应Release Resolve

当您以与我类似的方式使用容器 ,您可能不必在代码中的任何地方调用Release 您将Resolve根问题,但是Dispose容器本身将负责释放它。 您也可能会通过类型化的工厂隐式解析其他组件,在这种情况下, 您还应该 (通过工厂) 释放它们 ,但这通常就是这样。

因此最终结果是,它并不像听起来那样可怕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM