主要只使用DI来“外部”。依赖呢?

时间:2015-07-30 15:36:04

标签: c# dependency-injection inversion-of-control

我曾经认为,如果您在代码中看到以下内容,那就是BAD:

MyObject obj = new MyObject();

所有对象都应该由IOC容器新建,但是我昨天问的一个问题似乎是我认为错了。

根据我的理解,您现在只需要担心外部依赖项。您可以自由地将所有内部课程新建到您的内容中,而不是新建任何外部依赖项。在这方面,您只需要在类的边界/边(服务)上创建对象的接口,或者您希望客户端将与您进行通信。听起来不错吗?

1 个答案:

答案 0 :(得分:1)

你应该区分newables and injectables。注入是我们的应用程序中具有行为的组件。 Newables与其他任何东西有关,例如基元,字符串,DTO,实体,消息,命令等。这些newables呈现系统的运行时数据,并使用方法调用通过注入的对象图推送运行时数据。这些注射剂由您的组合根(因此可选择您的容器)创建,而新的可由应用程序代码创建。因此,如果您遵循Misko Hevery,在您的代码中使用new语句就可以了,只要它们是“newables”。

如果你遵循Dependency Inversion Principle,你知道“高级模块不应该依赖于低级模块。两者都应该取决于抽象。”维基百科中的定义和Robert C. Martin的原始文章都没有明确定义模块是什么。在我看来,它可能是一个类,或者有时是一组一起形成模块的类。依赖原则所说的是这样的模块不应该依赖于其他模块。这可能就是你所说的“外部依赖”。因此,在模块中,一切都可以高度凝聚,而模块与其他模块的耦合度很低。

另一种看待它的方法是从可测试性的角度来看。即使您有一个由多个类组成的模块,如果该模块内的耦合阻碍了可测试性,那么您最好重构该模块以使其可测试。最好的方法是依赖注入。这可能导致在一个组件中进行依赖注入,以使该组件可测试。

从可维护性的角度来看,最后一种看待这个问题的方法。通常会有一些常见的位置,您希望添加横切关注点。例如,所有业务操作通常应该包含在事务中,应该检查权限,需要编写审计日志等等。为了使您的应用程序保持可维护性,您需要拦截点,您可以轻松应用这些交叉点关注。您通常会在组件边界周围看到这些拦截点,但如果您在组件中检测需要应用横切关注点的位置,那么这将是开始使用接口的地方。