C# 将语句与依赖项注入一起使用
在我的应用程序中,我使用实体框架,并希望编写单元测试 Google叔叔告诉我最好对我的dbContext使用using语句。另一方面,我想用依赖项注入来模拟我的dbContext 我怎样才能解决这个问题 使用statemant: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();
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
,这里依赖项注入容器将为您创建实例,处理实例是容器的责任,而不是您的责任。