【问题标题】:Using statement with Dependency Injection使用带有依赖注入的语句
【发布时间】:2018-04-17 13:30:18
【问题描述】:

在我的应用程序中,我使用实体框架并想编写单元测试。

Google 叔叔告诉我最好为我的 dbContext 使用 using-statemant。另一方面,我想用依赖注入模拟我的 dbContext。

我该如何解决这个问题?

使用状态:

using (var db = new ApplicationDbContext())
            {
                return await db.OrderingEquipments.ToListAsync();
            }

依赖注入:

        public CupsController(IApplicationDbContext db)
    {
        //_context = obj;
    }

【问题讨论】:

  • 您在需要的地方注入上下文,并选择适当的生命周期(例如 Web 请求生命周期)。在该生命周期结束时,您处置上下文。
  • 你使用的是什么 IoC/DI 容器?
  • 大多数 IoC 容器会为您处理这些问题。无需使用using。例如 - autofaccn.readthedocs.io/en/latest/lifetime/disposal.html .
  • 警惕模拟不属于您的组件。你可能做出了无法兑现的承诺……
  • 谷歌叔叔不是.net专家!!当然using应该在你创建新实例的时候使用,但是当你不创建的时候,你不应该使用using,这里依赖注入容器会为你创建实例,容器负责处理,不是你的。

标签: c# .net entity-framework unit-testing


【解决方案1】:

您可以使用工厂合同;示例:

interface IDbContextProvider
{
    IDbContext Get();
}

这是您注入消费者的接口。然后您使用该提供程序实例来获取一次性上下文:

CupsController(IDbContextProvider provider)
{
    using (var context = provider.Get()) 
    {
    }
}

【讨论】:

    【解决方案2】:

    您可以直接使用IServiceProvider:创建一个类的实例:

    var context = IServiceProvider.GetType(typeof(IApplicationDbContext));
    

    IServiceProvider 实例应该在您的 HttpContext 中,您可以在其中访问它并创建类型的实例。

    EF 依赖问题

    实体框架需要能够在上下文范围之外创建 DbContext,以便使用它们提供的命令行工具创建和执行数据库迁移。

    因此添加构造函数依赖会导致使用实体框架命令行工具时抛出异常!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2017-04-26
      • 2016-07-21
      • 2023-03-09
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多