.net 如何实例化已注入依赖项的类的对象?

.net 如何实例化已注入依赖项的类的对象?,.net,inversion-of-control,constructor-injection,.net,Inversion Of Control,Constructor Injection,假设我有一个注入了依赖项的类: public class SomeBusinessCaller { ILogger logger; public SomeBusinessCaller(ILogger logger) { this.logger = logger; } } 我的问题是,如何实例化该类的对象?假设我有一个实现,叫做Apploger。我说了以后 ObjectFactory.For<ILogger>().Use<AppLogger>

假设我有一个注入了依赖项的类:

public class SomeBusinessCaller {
   ILogger logger;
   public SomeBusinessCaller(ILogger logger) {
       this.logger = logger;
   }
}
我的问题是,如何实例化该类的对象?假设我有一个实现,叫做Apploger。我说了以后

ObjectFactory.For<ILogger>().Use<AppLogger>();
ObjectFactory.For().Use();
如何调用SomeBusinessCaller的构造函数?我在打电话吗

SomeBusinessCaller caller = ObjectFactory.GetInstance<SomeBusinessCaller>();
SomeBusinessCaller caller=ObjectFactory.GetInstance();

或者有一种不同的策略?

取决于您使用的DI容器,然后:要求容器为您提供
SomeBusinessCaller的实例

容器应使用自动连线自动确定SomeBusinessCaller需要
ILogger
的实例,并且由于注册了
AppLogger
,因此它可以满足该要求

然而


相反,您应该让DI容器在应用程序中一次组成整个依赖关系图。

使用调用方的代码并不是处于真空状态。与其假设您需要自己创建
SomeBusinessCaller
的实例,只需声明对它的依赖关系:

public class SomeOtherClass
{
    public SomeOtherClass(SomeBusinessCaller caller)
    {
        // ...
    }
}
容器将发现
SomeBusinessCaller
需要
ILogger
,并将自动提供
AppLogger
的实例

并且,当某个对象需要该类的实例时:

如果您对所编写的所有对象都遵循该逻辑,那么最终您将恰好有一个对象实际请求实例:

public static void Main()
{
    // ...Initialize ObjectFactory...

    var compositionRootObject = ObjectFactory.GetInstance<YetAnotherClass>();

    compositionRootObject.DoYourThing();
}
publicstaticvoidmain()
{
//…初始化对象工厂。。。
var compositionRootObject=ObjectFactory.GetInstance();
compositionRootObject.DoYourThing();
}

我知道自动连接必须确定类的要求,但是调用方仍然需要为类构造函数提供参数。容器通过为您创建一个
AppLogger
实例来提供参数。您不必自己提供它。因此,无参数构造函数将完成这项工作?您应该只对那些有意义的类使用默认构造函数。如果
AppLogger
在其构造函数中接受依赖项,那么也只需向容器注册这些依赖项。容器将解析所有依赖项,直到所有依赖项都满足为止(或者它遇到未注册的内容)。所以,我需要设置容器,然后通过GetInstance调用仅实例化一个对象?容器将自动满足其所有依赖关系?完全正确。如果在解析根对象后需要创建对象,则应向容器注册工厂,并将其放入需要创建实例的对象的构造函数中。
public static void Main()
{
    // ...Initialize ObjectFactory...

    var compositionRootObject = ObjectFactory.GetInstance<YetAnotherClass>();

    compositionRootObject.DoYourThing();
}