Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖注入:ASP vNext。这是怎么回事?_C#_Entity Framework_Dependency Injection_Cqrs_Asp.net Core - Fatal编程技术网

C# 依赖注入:ASP vNext。这是怎么回事?

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; } //

因此,在我基于CQRS的bug跟踪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>();
services.AddSingleton();
我的单元测试和手动集成测试都工作得很好,就像我在没有DI的情况下手动调用它时一样。

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

我已经在Github repo中查看了一些源代码(不是这样),但无法真正找到可能发生这种情况的地方。
我可能忽略了一些关键的东西,或者它可能只是隐藏得很好,因为它仍然在预发布中

  • 调用
    AddSingleton
    时,类型注册存储在DI容器中。代码是
  • 当您通过调用
    AddMvc
    添加MVC服务时,它们将被添加到与步骤1中的类型相同的DI容器中。奇迹发生了。这就是容器在堆栈中向上传递并在组件之间共享的方式
  • 当MVC激活控制器时,它将使用容器中的类型创建一个实例;这种情况经常发生。最终,它被称为。它将尝试使用容器中的注册来解析该服务及其所有依赖项
  • 在您的特定情况下,还需要注册
    BugContext

    您可能会发现我不久前写的这篇关于ASP.NET5中DI的文章很有用。在代码方面有点过时,但原则是一样的:

    另外,如果您真的想看看会发生什么,请看一下我写的另一篇关于在ASP.NET5中调试框架代码的文章。您可以进入MVC并查看确切的代码路径:
    . 如果您想查看场景中的所有代码,您需要and的源代码。

    由于
    BugContext
    是一个具体的对象,而不是传递到构造函数中的接口,DI框架只是在为您调用默认构造函数并将其传入。@DavidG感谢您为我确认这一点。也许在我的措辞中不是100%清楚,但是,我想知道它是如何做到这一点的。因此,我知道它的局限性以及为什么我不能/不能用它做某些事情。更准确地说,在您注册具体实现的地方,IoC框架检查了
    BugCommandHandler
    上可用的构造函数,并找到了一个构造函数,使用了
    BugContext
    类型的参数。这就是它在请求
    IBugCommandHandler
    实例时将使用的构造函数。这与您的问题有点无关,但由于您正在应用CQR,我发现很奇怪,您定义了许多一个接口,例如
    IBugCommandHandler
    ,而不是一个通用的
    ICommandHandler
    。您错过了很多灵活性和可维护性方面的好处。看一看。