IoC DI,如何在核心内深入解决?

时间:2014-07-19 21:08:15

标签: inversion-of-control

每个人都说IOC不应该是任何静态或全局的,应该在root创建。但是我如何深入到我的代码中呢?

假设我有一个入门点ClassA。在这里,我可以创建一个IOC的实例,并将我的所有接口注册到具体的类型等。但那么呢?我现在开始通过IoC吗?当然这会违反DIP?我读过的所有文章都没有讨论过访问Ioc的问题,我认为这是基本的。我相信我必须在这里遗漏一些非常简单的东西:)

让我们说ClassA创建了一个创建A ClassC的ClassB。 C类需要访问我已解析的IDatabase。怎么做到的?我是否必须完全通过IoC?

1 个答案:

答案 0 :(得分:1)

您应该传递类所需的依赖项。如果C类需要访问IDatabase,则必须允许IoC容器将IDatabase的实现传递到C类,例如在C语言的构造函数上具有IDatabase参数。

如果IoC框架负责创建C类,那么它还有责任为C类提供所需的依赖项。只要在IoC容器中针对实现IDatabase的类注册了IDatabase,那么C类构造函数上的IDatabase参数就应该自动传递给IDatabase的实现。

查看创建ClassC的ClassA创建ClassB的示例。 A类应该是' newing'使用' new'升级ClassB的实例关键字(我在这里使用C#或Java语法)。

而是,ClassA,ClassB和ClassC都应该在您的IoC容器中注册。如果ClassA需要ClassB的实例,那么为ClassA提供一个带有ClassB参数的构造函数。您的IoC容器应自动解析ClassB的实例并将其传递给ClassA。在你需要的时候,这同样适用于链条。

使用构造函数(又名' Constructor Injection')并不是唯一的选择。您通常也可以使用Property Injection,其中公共属性设置器由IoC Container自动设置(并且还有更罕见的'接口注入')。但是构造函数注入通常是最好的方法,因为在实例化类之前,它确实非常清楚类所需的依赖项;属性注入可能不清楚,因为IoC容器可能会或可能不会设置属性,具体取决于属性类型是否已注册。