依赖注入:ASP vNext。这是如何工作的?

Dependency Injection: ASP vNext. How is this working?

所以在我基于 CQRS 的错误跟踪网络 API 中,我在进行和实施单元测试之前重构我的代码(诚然,单元测试应该先进行);我有这个 class 和构造函数:

public class BugCommandHandler : IBugCommandHandler
{
    private BugContext db;

    public BugCommandHandler(BugContext bugContext)
    {
        db = bugContext;
    }

    //Interface implementation
}

在我的控制器中,我有这个:

public class BugsController : Controller
{
    private IBugCommandHandler commandHandler;
    private BugContext db;

    public BugsController(BugContext bugContext, IBugCommandHandler bugCommandHandler)
    {
        db = bugContext;
        commandHandler = bugCommandHandler;
    }
}

最后,在我的 Startup class 中,我注入了

的依赖项
services.AddSingleton<IBugCommandHandler, BugCommandHandler>();

我的单元测试和手动集成测试都工作正常,就像我在没有 DI 的情况下手动调用它时一样。

BugCommandHandler 实现现在如何工作,就像在其构造函数中使用数据库上下文调用它一样(在幕后 'magic')?实现这一目标的过程是什么?

我已经检查了(不像 that)Github 存储库中的一些源代码,但无法真正找到可能发生的位置。
我可能忽略了一些重要的东西,或者它可能只是隐藏得很好,因为它仍处于预发布阶段。

  1. 当您调用AddSingleton时,类型注册存储在DI容器中。密码是here.
  2. 当您通过调用 AddMvc 添加 MVC 服务时,它们将被添加到与步骤 1 中的类型相同的 DI 容器中。奇迹发生了 here。这就是容器向上传递堆栈并在组件之间共享的方式。
  3. 当 MVC 激活您的控制器时,它将使用容器中的类型创建一个实例;发生 here. Eventually, this code 的情况被调用。它将尝试使用容器中的注册来解析该服务及其所有依赖项。

在您的特定情况下,您还需要 BugContext 进行注册。

我前段时间写的关于DI的这篇文章你可能会觉得有用 ASP.NET 5. 代码有点过时,但原理是一样的:http://blogs.msdn.com/b/webdev/archive/2014/06/17/dependency-injection-in-asp-net-vnext.aspx

此外,如果你真的想看看会发生什么,可以看看我在ASP.NET中写的另一篇关于调试框架代码的文章 5.你可以进入MVC并查看确切的代码路径: http://blogs.msdn.com/b/webdev/archive/2015/02/06/debugging-asp-net-5-framework-code-using-visual-studio-2015.aspx . If you want to see all the code in your scenario you will need the sources for DependencyInjection and MVC.