依赖注入: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 存储库中的一些源代码,但无法真正找到可能发生的位置。
我可能忽略了一些重要的东西,或者它可能只是隐藏得很好,因为它仍处于预发布阶段。
- 当您调用
AddSingleton
时,类型注册存储在DI容器中。密码是here.
- 当您通过调用
AddMvc
添加 MVC 服务时,它们将被添加到与步骤 1 中的类型相同的 DI 容器中。奇迹发生了 here。这就是容器向上传递堆栈并在组件之间共享的方式。
- 当 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.
所以在我基于 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 存储库中的一些源代码,但无法真正找到可能发生的位置。
我可能忽略了一些重要的东西,或者它可能只是隐藏得很好,因为它仍处于预发布阶段。
- 当您调用
AddSingleton
时,类型注册存储在DI容器中。密码是here. - 当您通过调用
AddMvc
添加 MVC 服务时,它们将被添加到与步骤 1 中的类型相同的 DI 容器中。奇迹发生了 here。这就是容器向上传递堆栈并在组件之间共享的方式。 - 当 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.