Asp.net mvc 3 Castle Windsor组件依赖关系和生活方式
我想知道什么是Castle Windsor组件依赖性生活方式的最佳实践。例如,如果我有一个依赖于ISession的Repository类。如果存储库设置为PerWebRequest,但ISession设置为transient,这会给windsor释放组件带来任何问题,以便GC能够正确清理吗 从逻辑上看,这似乎是可行的,因为在webrequest期间对存储库的每个请求都将获得对同一实例的引用。该实例将保存对单个ISession的引用,该ISession在第一次请求时被实例化以满足Repo依赖性。温莎将知道何时回购因PerWebRequest跟踪而超出范围,因此应该知道何时清理ISession 然而,Krzysztof Koźmic暗示,你不应该让一个组件依赖于比它自身生活方式更短的东西 [编辑]Asp.net mvc 3 Castle Windsor组件依赖关系和生活方式,asp.net-mvc-3,castle-windsor,Asp.net Mvc 3,Castle Windsor,我想知道什么是Castle Windsor组件依赖性生活方式的最佳实践。例如,如果我有一个依赖于ISession的Repository类。如果存储库设置为PerWebRequest,但ISession设置为transient,这会给windsor释放组件带来任何问题,以便GC能够正确清理吗 从逻辑上看,这似乎是可行的,因为在webrequest期间对存储库的每个请求都将获得对同一实例的引用。该实例将保存对单个ISession的引用,该ISession在第一次请求时被实例化以满足Repo依赖性。温
我的问题是,让一个Windsor组件依赖于比它自身生活方式更短的东西(即PerWebRequest组件->瞬态组件)是可以接受的吗?为什么在一个web请求中有多个会话。关于会话,我在web应用程序中常用的一种模式是工作单元模式。其中,web请求是工作单元。仅当您明确释放它或它的父级时,才会释放瞬态生活方式。因此,对于具有每web请求生活方式的组件来说,具有作为依赖项的瞬态组件应该是很好的。是的,它可以是非常好的,特别是在
something-->transient
的情况下。你需要担心的是:
- 我是不是强迫这个组件比它应该活的时间长(并留在内存中)
- 我不打算在我所依赖的对象被自动释放的情况下结束(比如在单例中,它依赖于每一个web请求对象,当第一个web请求结束时被释放)。在这种情况下,您最终将使用处于无效状态的对象,这取决于您如何实现它,它将抛出异常(fail fast)或行为异常(您不想出现)
singleton-(取决于)->singleton工厂-(解析)->每个web请求组件
一个单例对象可能依赖于一个工厂,它使用这个工厂来拉取(比如)它用来完成其工作的每个web请求对象。这样,如果实施得当,它就不会有上面讨论的缺点
希望有帮助
哦,还有我的另一个答案,你在你的问题中联系到了-它说的是经验法则,而不是严格的法律。在大多数情况下,这可能是正确的,但是,如上所述,如果你知道自己在做什么,打破它是可以的。这也是为什么温莎检测这些病例的诊断被称为潜在的配置错误的组件的原因我在这里没有看到任何具体问题。。。你能把它具体化吗?谢谢你详尽的回答。