假设我有一些依赖注入的类:
public class SomeBusinessCaller {
ILogger logger;
public SomeBusinessCaller(ILogger logger) {
this.logger = logger;
}
}
我的问题是,如何实例化该类的对象?假设我有一个实现,称为AppLogger。我说完之后
ObjectFactory.For<ILogger>().Use<AppLogger>();
如何调用SomeBusinessCaller的构造函数?我打电话了
SomeBusinessCaller caller = ObjectFactory.GetInstance<SomeBusinessCaller>();
或者有不同的策略?
答案 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();
}