C# 将语句与依赖项注入一起使用

C# 将语句与依赖项注入一起使用,c#,.net,entity-framework,unit-testing,C#,.net,Entity Framework,Unit Testing,在我的应用程序中,我使用实体框架,并希望编写单元测试 Google叔叔告诉我最好对我的dbContext使用using语句。另一方面,我想用依赖项注入来模拟我的dbContext 我怎样才能解决这个问题 使用statemant: using (var db = new ApplicationDbContext()) { return await db.OrderingEquipments.ToListAsync();

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

Google叔叔告诉我最好对我的dbContext使用using语句。另一方面,我想用依赖项注入来模拟我的dbContext

我怎样才能解决这个问题

使用statemant:

using (var db = new ApplicationDbContext())
            {
                return await db.OrderingEquipments.ToListAsync();
            }
依赖项注入:

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

你可以使用工厂合同;例如:

interface IDbContextProvider
{
    IDbContext Get();
}
这是您注入到消费者的接口。然后使用该提供程序实例获取一次性上下文:

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

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

var context = IServiceProvider.GetType(typeof(IApplicationDbContext));
IServiceProvider
实例应该在您的HttpContext中,您可以在其中访问它并创建类型的实例

EF依赖问题 Entity framework需要能够在上下文范围之外创建DBContext,以便使用它们提供的命令行工具创建和执行数据库迁移


因此,添加构造函数依赖项将导致在使用实体框架命令行工具时引发异常

在需要的地方注入上下文,并选择适当的生存期(例如web请求生存期)。在生命周期结束时,您将处理上下文。您使用的是什么IoC/DI容器?大多数IoC容器将为您处理上下文。无需使用
使用
。例如-。小心模仿你不拥有的组件。你可能会做出无法兑现的承诺…谷歌叔叔不是.net专家!!当然,当您创建新实例时,应该使用
using
,但当您不创建实例时,不应该使用
using
,这里依赖项注入容器将为您创建实例,处理实例是容器的责任,而不是您的责任。