.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();
}