我最近收到一位同事提出的关于依赖注入如何运作的问题。下面的文章清楚地解释了它。
https://blogs.endjin.com/2014/04/understanding-dependency-injection/
但是,我有一个特定的问题,我仍然无法回答,因为我不明白:如何使用像.Resolve或.GetInstance这样的方法调用构造函数? DI框架是否以某种方式拦截它们并提供所需的构造函数依赖项?
答案 0 :(得分:1)
首先,重要的是要了解DI doet not 需要使用DI库a.k.a. DI Container。 DI是一套原则和实践,DI Container是一个可选工具。在没有容器的情况下应用DI 是一种称为Pure DI的做法。 This article,this和this描述了何时应该使用容器。
也就是说,构造函数注入只是静态声明类所需的依赖关系作为构造函数参数的行为。如果不使用容器,这意味着'某人'仍将显式调用此类构造函数(使用普通旧代码)并传入其依赖项。
然而,对于紧密耦合的代码,我们试图阻止应用程序的“正常”部分调用那些构造函数,因为这将再次导致紧密耦合的代码。相反,我们将此构造移动到应用程序的入口点,即所谓的Composition Root。入口点的此类构造可能如下所示:
public Controller CreateController(Type type)
{
if (type == typeof(HomeController))
return new HomeController(
new UserServices(
new LoggingUsersRepositoryDecorator(
new FileLogger(),
new UsersRepository(connectionString))));
if (type == ...)
return base.CreateController(type);
}
如果我们要使用DI容器,我们只会指定容器中抽象和实现之间的映射;我们不必指定类所需的依赖项。然而,保持不变的是我们“连线”和“解决”的位置。在练习Pure DI或使用工具时,我们都在 Composition Root 中执行此操作。
答案 1 :(得分:1)
它通常使用反射来研究构造函数签名并传递适当的参数。可以使用Activator.CreateInstance
完成实际创建(请参阅https://msdn.microsoft.com/en-us/library/wcxyzt4d(v=vs.110).aspx)。