【发布时间】:2011-01-27 19:50:25
【问题描述】:
我意识到 DI 是一种非常灵活的设计模式,尽管我很难接受它作为我创建解耦代码的“灵丹妙药”。
原因如下:当依赖对象的生命周期比它注入的依赖项的生命周期长时会发生什么?
示例应用程序:我有一个 BusinessLogic 类,它在我的应用程序的生命周期内被实例化。此类需要DataContext 对象来执行数据库操作。我已经创建了一个抽象的DataContextFactory,它有两个实现:StaticDataContextFactory 和WebDataContextFactory。前者在应用程序的整个生命周期内维护一个 DataContext,而后者将为每个 HTTP 请求创建新的 DataContext。
示例中的问题: 如您所见,使用StaticDataContextFactory 时一切正常。但是,当使用 WebDataContextFactory 时,BusinessLogic 将失败,因为它被注入了 DataContext,一旦第一个请求完成,该 DataContext 就会过期/释放。
我的问题是:所有依赖对象的生命周期都必须小于或等于其依赖关系的生命周期吗?如果是这样,那么当实例化依赖类的代码不知道每个依赖项的生命周期时会发生什么?
【问题讨论】:
-
我不确定尝试在应用程序的整个生命周期中保持面向工作单元的 DataContext 是否有效。也许您应该考虑让您的 BusinessLogic 类基于每个方法获取和处理数据上下文?或者更好的是,找到一种方法让您的 BusinessLogic 类不是静态的,而是由需要它的 Web 请求实例化...
-
虽然我意识到这个特定的例子可以重做,但我仍然怀疑我会发现自己处于这样一种情况,即一个可靠对象的范围比它的一个依赖项更长,但不会意识到由于各种抽象的情况。简而言之:您对我最后一段中的问题的回答是“是”。
-
我同意乔尔的第一句话。
-
劳伦斯,你错过了重要的一点。您注入的对象可以在您需要时检索或实例化另一个对象(在您的情况下为 DataContext)。因此,“当前”属性或方法。
-
感谢 cmets 伙计们,但也许我会分享一个真实的例子:在 Umbraco(一个 .NET CMS)中,实例化 DataContext 的成本相对较高。此外,由于 DataContext 在内部执行的各种缓存操作,因此通过反复重用 DataContext 可以获得显着的性能优势。此外,通过执行 Rushmore 优化等,更复杂的实现可能会走得更远(我离题了)。尽管如此:汇集这些对象有一个明显的优势。但是,这会带来上述复杂性。
标签: c# .net design-patterns dependency-injection inversion-of-control