因此,在我基于CQRS的错误跟踪Web-API中,我在进行和实施单元测试之前重构了我的代码(诚然,应该首先考虑);我有这个类和构造函数:
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<IBugCommandHandler, BugCommandHandler>();
我的单元测试和手动集成测试都运行正常,就像我在没有DI时手动调用它一样。
现在BugCommandHandler
实现如何在其构造函数中使用数据库上下文调用(幕后的'magic')?它实现这一目标的过程是什么?
我已经检查了(不像那个)Github仓库中的一些源代码,但无法真正找到这可能发生的地方。
我可能会忽略一些至关重要的东西,或者它可能只是被隐藏得很好,因为它仍处于预发布阶段。
答案 0 :(得分:6)
AddSingleton
时,类型注册将存储在DI容器中。代码为here。AddMvc
添加MVC服务时,它们将被添加到与步骤1中的类型相同的DI容器中。魔术发生here。这就是容器如何在堆栈中传递并在组件之间共享。在您的特定情况下,您还需要注册BugContext
。
你可能会发现我之前写过的关于ASP.NET 5中DI的有用的文章。它在代码方面有点过时,但原理是相同的: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。如果您想查看方案中的所有代码,则需要DependencyInjection和MVC的来源。