C# 依赖注入:ASP vNext。这是怎么回事?
因此,在我基于CQRS的bug跟踪web API中,我在进行和实现单元测试之前重构代码(诚然,单元测试应该是第一位的);我有这个类和构造函数:C# 依赖注入:ASP vNext。这是怎么回事?,c#,entity-framework,dependency-injection,cqrs,asp.net-core,C#,Entity Framework,Dependency Injection,Cqrs,Asp.net Core,因此,在我基于CQRS的bug跟踪web API中,我在进行和实现单元测试之前重构代码(诚然,单元测试应该是第一位的);我有这个类和构造函数: public class BugCommandHandler : IBugCommandHandler { private BugContext db; public BugCommandHandler(BugContext bugContext) { db = bugContext; } //
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>();
services.AddSingleton();
我的单元测试和手动集成测试都工作得很好,就像我在没有DI的情况下手动调用它时一样。
BugCommandHandler
实现现在是如何工作的,就好像它是在构造函数中用数据库上下文调用的一样(幕后的“魔术”)?它实现这一目标的“过程”是什么?
我已经在Github repo中查看了一些源代码(不是这样),但无法真正找到可能发生这种情况的地方。
我可能忽略了一些关键的东西,或者它可能只是隐藏得很好,因为它仍然在预发布中
AddSingleton
时,类型注册存储在DI容器中。代码是AddMvc
添加MVC服务时,它们将被添加到与步骤1中的类型相同的DI容器中。奇迹发生了。这就是容器在堆栈中向上传递并在组件之间共享的方式BugContext
您可能会发现我不久前写的这篇关于ASP.NET5中DI的文章很有用。在代码方面有点过时,但原则是一样的:
另外,如果您真的想看看会发生什么,请看一下我写的另一篇关于在ASP.NET5中调试框架代码的文章。您可以进入MVC并查看确切的代码路径:
. 如果您想查看场景中的所有代码,您需要and的源代码。由于
BugContext
是一个具体的对象,而不是传递到构造函数中的接口,DI框架只是在为您调用默认构造函数并将其传入。@DavidG感谢您为我确认这一点。也许在我的措辞中不是100%清楚,但是,我想知道它是如何做到这一点的。因此,我知道它的局限性以及为什么我不能/不能用它做某些事情。更准确地说,在您注册具体实现的地方,IoC框架检查了BugCommandHandler
上可用的构造函数,并找到了一个构造函数,使用了BugContext
类型的参数。这就是它在请求IBugCommandHandler
实例时将使用的构造函数。这与您的问题有点无关,但由于您正在应用CQR,我发现很奇怪,您定义了许多一个接口,例如IBugCommandHandler
,而不是一个通用的ICommandHandler
。您错过了很多灵活性和可维护性方面的好处。看一看。