2

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

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

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

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

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

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

或者有不同的策略?

4

2 回答 2

2

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

容器应该使用自动装配来自动确定 SomeBusinessCaller 需要一个 的实例ILogger,并且由于AppLogger已注册,它可以满足该要求。

但是,不要将 DI 容器用作静态服务定位器

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

于 2010-03-24T14:33:11.930 回答
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();
}
于 2010-03-24T16:22:03.893 回答