【发布时间】:2011-06-26 12:10:28
【问题描述】:
我目前正在权衡 DI 和 SL 之间的优缺点。但是,我发现自己处于以下 catch 22 中,这意味着我应该对所有事情都使用 SL,并且只将 IoC 容器注入每个类。
DI Catch 22:
某些依赖项,例如 Log4Net,根本不适合 DI。我将这些元依赖称为元依赖,并认为它们对调用代码应该是不透明的。我的理由是,如果一个简单的类“D”最初是在没有日志记录的情况下实现的,然后增长到需要日志记录,那么依赖类“A”、“B”和“C”现在必须以某种方式获得这种依赖关系并将其从“A”到“D”(假设“A”组成“B”,“B”组成“C”,依此类推)。我们现在对代码进行了重大更改,只是因为我们需要登录一个类。
因此,我们需要一种不透明的机制来获得元依赖。我想到了两个:Singleton 和 SL。前者有已知的限制,主要是关于严格的作用域能力:单例最多将使用存储在应用程序范围内的抽象工厂(即在静态变量中)。这允许一些灵活性,但并不完美。
更好的解决方案是将 IoC 容器注入到此类类中,然后使用该类中的 SL 来解决容器中的这些元依赖项。
因此 catch 22:因为该类现在被注入了一个 IoC 容器,那么为什么不也使用它来解决所有其他依赖项呢?
非常感谢您的想法:)
【问题讨论】:
-
您关于需要将其从 A->B->C->D 传递下来的评论表明您混淆了运行时和创建时间。见misko.hevery.com/2009/03/30/collaborator-vs-the-factory/…
-
很棒的评论 WW,老实说,这有助于纠正我一直有重新 DI 的一个很大的心理障碍。
-
恕我直言,服务位置是穷人的控制反转,它为您提供了适当 IoC 的一些好处,但由于不明确,它也失去了许多好处。依赖注入是它的所在。
标签: c# dependency-injection singleton dependency-management service-locator