Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 处理与DI/IoC的关系和潜在不一致_Dependency Injection_Inversion Of Control - Fatal编程技术网

Dependency injection 处理与DI/IoC的关系和潜在不一致

Dependency injection 处理与DI/IoC的关系和潜在不一致,dependency-injection,inversion-of-control,Dependency Injection,Inversion Of Control,我在设计类以最好地利用DI/IoC原则时遇到了困难,特别是当一个类与其依赖项之一共享一个依赖项时(即,X有依赖项Y和Z,Y有依赖项Z) 举个例子可能会有用: 假设我有一个类,它将封装我的应用程序的一些连接信息。称之为“连接信息” class ConnectionInfo { // ... } 我已经设计了一个使用连接信息的worker类,因此我将通过构造函数注入依赖项 class Worker { public Worker(ConnectionInfo c) {

我在设计类以最好地利用DI/IoC原则时遇到了困难,特别是当一个类与其依赖项之一共享一个依赖项时(即,X有依赖项Y和Z,Y有依赖项Z)

举个例子可能会有用:

假设我有一个类,它将封装我的应用程序的一些连接信息。称之为“连接信息”

class ConnectionInfo
{
    // ...
}
我已经设计了一个使用连接信息的worker类,因此我将通过构造函数注入依赖项

class Worker 
{
    public Worker(ConnectionInfo c) 
    {
        // ...
    }
}
现在,假设我想构建另一个类。它需要访问连接信息,但我还想访问Worker类提供的功能

class AnotherClass
{
    public AnotherClass(ConnectionInfo c, Worker w)
    {
       // ...
    }
}
这一切都很好。但是,注入Worker的ConnectionInfo对象与注入另一个类的ConnectionInfo对象之间存在隐含的逻辑关系。只有当它们是一个且相同时,设计才有意义。但这并不是强制执行的。并没有什么可以阻止一个ConnectionInfo被注入另一个类,以及一个完全不相关的ConnectionInfo被注入Worker

我是否以错误的方式与国际奥委会/国际奥委会打交道?

类是否应该以不同的方式设计,或者应该以另一种方式处理问题(例如通过参数验证强制执行,或者可能只是将其留给IoC容器)

我认为课堂设计没有问题

当客户端代码需要另一个类的对象时,它将创建自己的ConnectonInfo和Worker依赖项

实际上有两种情况

1-您的ConnectionInfo和Worker是否为单例:在这种情况下,如果您创建另一个类的对象,则ConnectionInfo和Worker的相同对象将被另一个类共享

2-如果第1点不是真的:那么每次创建AnotehrClass时,容器都会将依赖项作为新对象注入

但是对于ConnectionInfo,我可能会说它可能是一个Sigleton对象,因为它是应用程序需要的公共信息,所以我会说将ConctionInfo设置为Singleton和rest是可以的,我不认为您违反了任何IoC规则