【发布时间】:2019-08-23 05:08:48
【问题描述】:
我正在使用 Entity Framework Core for MySql 和数据库优先方法。
搭建好数据库后,生成上下文类:sakilaContext.cs(sakila是MySql内置的数据库/方案,我用它来玩玩)。
我在 Startup.cs 中注入了我的数据库
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
var connectionString = @"server=localhost;port=1123;user=root;password=xxx;database=sakila";
services.AddDbContext<sakilaContext>(options => options.UseMySql(connectionString));
}
在我的 api 控制器中,我这样做:
private sakilaContext dbCtx;
public SakilaController(sakilaContext dbContext)
{
dbCtx = dbContext;
}
只是想知道,
- 这种情况下注入具体的实现是不是错了??
- 如果是,我怎么能只注入一个接口而不是注入一个具体的实现?
谢谢
【问题讨论】:
-
1.我认为不,这没有什么问题,因为通用
dbcontext不会包含您的属性,因此您无法使用它 -
@KienChu 呵呵,我有点同意你的看法。但是如果我们注入一个具体的类,它会破坏 DI 的目的吗?
-
DI 的好处不仅仅是连接抽象和实现,它有助于降低依赖图的复杂性,帮助您自动控制对象的生命周期等
-
我不认为注入一个具体的实现是错误的,特别是在这种情况下它是数据库提供者。我的意思是为数据库提供者提供 DI 和接口很好,但是你/你会在项目中多久切换一次数据库提供者?通常会选择一种数据库提供程序,并在项目的整个生命周期内持续使用。现在为了避免代码中到处都有具体的类,你可以编写一个工厂来生成 dbContext 并注入它的接口,或者使用提到的 MediatR @Darren。
-
@DavidLiang 那么我们将如何测试控制器?因为我们将该控制器与数据库提供程序相结合。
标签: c# dependency-injection asp.net-core-mvc entity-framework-core