【发布时间】:2012-07-02 06:32:22
【问题描述】:
我们有一个大型解决方案(> 100 个项目),几乎每种类型都使用服务定位器(示例 1)或我们自己的类型字典(示例 2)进行实例化。
例如我们有:
IQuote quote = Registry.Resolve<IQuote>();
或
IQuote quote = Registry.Find<IQuote>(args);
第二个示例转到配置文件以查找要使用反射实例化的具体对象。
在跟踪代码时会变得更加困难 - 因为不清楚使用的是什么具体类型 - 所以我们必须在尝试学习部分代码时多次检查映射。以上述为例,按下 F12 键:quote.DoSomething() 将带您进入接口定义。
实现起来也有点困难——我们需要一个接口 + 具体类 + 配置映射,而替代方案只有 1 个类。
想一想 - 我不知道有任何东西被“换掉”为另一种类型 - 所以虽然我们已经实现了 IoC,但我们没有使用它,或者至少 - 很少使用它。
那么 - 它真的值得吗?我们是否错误地/太多地实施了它?我是不是误会了什么?
【问题讨论】:
-
关于 F12 仅将您发送到接口定义因此不是很有帮助,请记住,这部分是 Visual Studio 的限制,而不仅仅是 DI 的错误:VS 可以 进行改进,使其指向被调用的实际方法。显然 VS 只能在调试会话期间执行此操作,并且只有在明确知道对象的运行时类型时才能这样做。
-
这是一个很好的问题,我真的很想阅读一些关于此的意见,但它可能更适合programmers.stackexchange.com
-
@stakx:如果 .net 中有 DI 的事实上的标准实现(我不知道),VS 自动识别 DI 类解析可以工作。
-
@Vlad,你误解了我的意思。我并不是说 VS 可以解析您的 DI 容器配置,但如果您在定义和使用变量的范围内进行调试,调试器可以检查您的
quote变量的实际类型,然后跳转到该类型的定义而不是 @ 987654326@ 的静态类型的定义。改进有限且不是很大,但在某些情况下可能会有所帮助。 -
@stakx:哦,我明白了。就像现在做的那样,F12 使用静态分析,因此它可以在程序不运行时使用。也许其他一些命令应该(是否?)在运行时可用,检查实际的运行时类型?这将是有价值的。
标签: .net design-patterns service-locator