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

时间:2010-03-24 13:51:35

标签: .net inversion-of-control constructor-injection

假设我有一些依赖注入的类:

public class SomeBusinessCaller {
   ILogger logger;
   public SomeBusinessCaller(ILogger logger) {
       this.logger = logger;
   }
}

我的问题是,如何实例化该类的对象?假设我有一个实现,称为AppLogger。我说完之后

ObjectFactory.For<ILogger>().Use<AppLogger>();

如何调用SomeBusinessCaller的构造函数?我打电话了

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

或者有不同的策略?

2 个答案:

答案 0 :(得分:2)

根据您使用的DI容器,:要求容器为您提供SomeBusinessCaller的实例。

容器应使用自动连接自动确定SomeBusinessCaller需要ILogger的实例,并且自AppLogger注册以来,它可以满足该要求。

然而,don't use the DI Container as a static Service Locator

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

答案 1 :(得分:1)

使用caller的代码不是真空。而不是假设您需要自己创建SomeBusinessCaller的实例,只需声明对它的依赖:

public class SomeOtherClass
{
    public SomeOtherClass(SomeBusinessCaller caller)
    {
        // ...
    }
}

容器会发现SomeBusinessCaller需要ILogger,它会自动提供AppLogger的实例。

并且,当某些事情需要的实例时类:

public class YetAnotherClass
{
    public YetAnotherClass(SomeOtherClass other)
    {
        // ...
    }
}

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

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

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

    compositionRootObject.DoYourThing();
}