首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle Windsor组件依赖关系和生活方式

Castle Windsor组件依赖关系和生活方式
EN

Stack Overflow用户
提问于 2011-07-22 22:13:00
回答 3查看 1.2K关注 0票数 3

我想知道Castle Windsor组件依赖生活方式的最佳实践是什么。例如,如果我有一个依赖于ISession的Repository类。如果存储库设置为PerWebRequest,但ISession设置为瞬态,这是否会对windsor释放组件以使GC能够正确清理造成任何问题?

从逻辑上讲,这似乎是可行的,因为在webrequest过程中,每个对Repository的请求都将获得对同一实例的引用。该实例将持有对单个ISession的引用,该实例在第一次被请求时被实例化以满足回购依赖关系。温莎将知道回购何时由于PerWebRequest跟踪而超出范围,因此应该知道何时清理ISession。

然而,Krzysztof Koźmic的this post暗示,你不应该有一个依赖于生活方式比它本身更短的组件。

编辑

我的问题是,让Windsor组件依赖于比它本身更短的生活方式(即PerWebRequest组件->瞬态组件),这是可以接受的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-16 05:51:45

是的,它可以非常好,特别是在something --> transient的情况下。你需要担心的事情是:

  • 我是否强制这个组件存在(并停留在内存中)的时间比它应该存在的时间更长?
  • 我不会在我所依赖的对象被自动释放的情况下结束(就像依赖于每个web请求的单个对象的情况,该对象在第一个web请求结束时被释放)。在这种情况下,您最终将使用处于无效状态的对象,这取决于您如何实现它,要么抛出异常(快速失败),要么行为不检(您不希望出现这种情况)。

如果您已经考虑了这两个因素,并且可能还有其他一些特定于您的场景的因素,那么您就处于一个很好的位置,可以做出明智的选择来推动依赖关系的发展。

或者,您可以通过间接层使其成为可传递的依赖关系:

singleton -(depends on)-> singleton factory -(resolves)-> per-web-request component

单例对象可能依赖于它用来拉取的工厂,比方说,它用来执行其工作的每个web请求的对象。有了它,如果实现得当,它就不会有上面讨论的缺点。

希望这能有所帮助。

哦,还有我的另一个答案,你在你的问题中链接到-它说的是经验法则,而不是严格的法律。在大多数情况下,它可能是正确的,但是,正如上面所讨论的,如果您知道自己在做什么,那么打破它是很好的。这也是为什么Windsor用于检测这些情况的诊断程序被称为潜在错误配置组件的原因

票数 6
EN

Stack Overflow用户

发布于 2011-10-13 10:08:39

为什么你会在一个web请求中有多个会话。关于会话,我在web应用程序中常用的一种模式是Unit of Work模式。其中web请求是工作单元。

票数 2
EN

Stack Overflow用户

发布于 2011-11-16 04:32:33

短暂的生活方式只有当你显式地释放它或它的父级时才会释放。因此,拥有一个短暂的组件,它是每个web请求生活方式的组件的依赖项,应该是很好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6791323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档