48
|
btlog Stefan Wick MSFT · 技术社区 · 14 年前 |
1
51
使用DI的正确方法是 构造器注入 或者另一个DI模式(但构造函数注入是最常见的)将依赖项注入到使用者中, 不考虑DI容器 .
在您的示例中,看起来您需要依赖项
注意如何将
您现在可以这样实现parse方法:
(不过,我怀疑可能涉及多个测试用例,在这种情况下,您可能希望 inject an Abstract Factory 而不是单个测试用例。) 从你 Composition Root ,您可以配置Unity(或任何其他容器):
当容器解析testsuiteparser时,它了解构造函数注入模式,因此 汽车线材 具有所有必需依赖项的实例。 创建一个单独的容器或传递容器只是 Service Locator anti-pattern 所以我不推荐。 |
2
12
我是新来的
我读了这里的答案,并没有真正理解被解释的是什么。最终帮助我“得到它”的是这篇文章: http://www.devtrends.co.uk/blog/how-not-to-do-dependency-injection-the-static-or-singleton-container 这一段特别是“灯泡”时刻: “99%的代码库应该不知道您的IOC容器。只有根类或引导程序使用容器,即使这样,一个解析调用通常都是构建依赖关系图和启动应用程序或请求所必需的。” 这篇文章帮助我理解,实际上我不能在整个应用程序中访问Unity容器,而只能在应用程序的根目录下访问。所以我必须一直重复地应用DI原则,回到应用程序的根类。 希望这能帮助像我一样困惑的人!:) |
3
4
您不需要在应用程序的很多地方直接使用容器。您应该在构造函数中获取所有依赖项,而不是从方法中获取它们。您的示例可以是这样的:
然后在整个应用程序中用相同的方法执行。当然,在某些时候,你必须解决一些问题。例如,在ASP.NET MVC中,此位置位于控制器工厂中。这是创建控制器的工厂。在此工厂中,您将使用容器解析控制器的参数。但在整个应用程序中,这只是一个地方(当您做更高级的事情时,可能还有更多的地方)。 还有一个不错的项目叫做 CommonServiceLocator . 这是一个项目,它为所有流行的IOC容器提供了一个共享接口,这样您就不会依赖于特定的容器。 |
4
0
如果只有一个可以有一个“serviceLocator”在服务构造函数周围传递,但以某种方式设法“声明”所注入的类的预期依赖项(即不隐藏依赖项),那么,全部(?)对服务定位器模式的异议可以平息。
遗憾的是,上面的内容显然只会存在于我的梦中,因为C禁止使用变量泛型参数(仍然如此),所以每次需要一个额外的泛型参数时手动添加一个新的泛型接口将是不明智的。 如果从另一方面来说,尽管C有以下限制,也可以实现上述目标……
这样,只需要做额外的输入就可以完成相同的事情。
我还不确定的是,考虑到
|
Nikolay K · Castle Windsor从类内拦截方法调用 8 年前 |
user3643376 · Unity ResolveAll泛型接口 9 年前 |
Ilias Kouroudis · 绕过Laravel服务提供商 9 年前 |
Wojciech Kozaczewski · 实体框架-容器的并发使用 9 年前 |
vishal mane · 在不使用容器的情况下从配置进行统一拦截 10 年前 |