依赖注入:ASP vNext.这是怎么回事?

Joe*_*ord 4 c# entity-framework dependency-injection cqrs asp.net-core

因此,在我基于CQRS的错误跟踪Web-API中,我在进行和实施单元测试之前重构了我的代码(诚然,应该首先考虑); 我有这个类和构造函数:

public class BugCommandHandler : IBugCommandHandler
{
    private BugContext db;

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

    //Interface implementation
}
Run Code Online (Sandbox Code Playgroud)

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

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

    public BugsController(BugContext bugContext, IBugCommandHandler bugCommandHandler)
    {
        db = bugContext;
        commandHandler = bugCommandHandler;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在我的Startup类中,我已经注入了依赖项

services.AddSingleton<IBugCommandHandler, BugCommandHandler>();
Run Code Online (Sandbox Code Playgroud)

我的单元测试和手动集成测试都工作正常,因为我在没有DI时手动调用它. 现在

如何BugCommandHandler实现如何在构造函数中使用数据库上下文调用(幕后"魔术")?它实现这一目标的过程是什么?

我已经签出(不喜欢那个)一些在GitHub库的源代码,但不能真正找到这个地方可能会发生.
我可能会忽略一些关键的东西,或者它可能只是被隐藏得很好,因为它仍处于预发布状态.

Vic*_*aci 6

  1. 通话时AddSingleton,类型注册存储在DI容器中.代码在这里.
  2. 当您通过调用添加MVC服务时AddMvc,它们将被添加到与步骤1中的类型相同的DI容器中.这里发生魔术.这就是容器如何在堆栈中传递并在组件之间共享.
  3. 当MVC激活您的控制器时,它将使用容器中的类型创建一个实例; 发生在这里.最终,这个代码被调用.它将尝试使用容器中的注册来解析该服务及其所有依赖项.

在您的特定情况下,您还需要BugContext注册.

您可能会发现我之前在ASP.NET 5中写过关于DI的这篇文章很有用.它在代码方面有点过时,但原理是相同的:http://blogs.msdn.com/b/webdev/存档/ 2014/06/17 /依赖喷射在-ASP净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.如果要查看场景中的所有代码,则需要DependencyInjectionMVC的源代码.