dependency injection:ASP vNext。 这是怎么回事?

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

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类中,我已经注入了依赖项

 services.AddSingleton(); 

我的unit testing和手动集成测试都工作正常,因为我在没有DI的情况下手动调用它。

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

我已经检查了(不是那样)Github仓库中的一些源代码,但无法真正找到这可能发生的地方。
我可能会忽略一些至关重要的东西,或者它可能只是被隐藏得很好,因为它仍处于预发布阶段。

  1. 当您调用AddSingleton ,类型注册将存储在DI容器中。 代码在这里 。
  2. 当您通过调用AddMvc添加MVC服务时,它们将被添加到与步骤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 。 如果要查看场景中的所有代码,则需要DependencyInjection和MVC的源代码。