【发布时间】:2018-06-07 02:31:43
【问题描述】:
假设我有一个小型 MVC Core 应用程序,我想在两个数据库引擎之间轻松切换(例如,我有 Entity Framework Core 和 MongoDB)。
在我的 appsettings.json 中,我有以下节点:
{
"UseMongo": false,
"MongoDB": {
"ConnectionString": "mongodb://127.0.0.1",
"DatabaseName": "CoreDB",
"IsSSL": true
},
"EntityDB": {
"ConnectionString": "mongodb://127.0.0.1",
"DatabaseName": "CoreDB"
}
}
然后在我的 Startup.cs 中,我有以下代码:
if (Configuration.GetValue<bool>("UseMongo"))
{
MongoDbContext.ConnectionString = Configuration.GetSection("MongoDB:ConnectionString").Value;
MongoDbContext.DatabaseName = Configuration.GetSection("MongoDB:DatabaseName").Value;
//Somehow inject context into application so it is available globally
}
else
{
EfDbContext.ConnectionString = Configuration.GetSection("EntityDB:ConnectionString").Value;
EfDbContext.DatabaseName = Configuration.GetSection("EntityDB:DatabaseName").Value;
//Somehow inject context into application so it is available globally
}
然后我声明一个接口,两个存储库类从该接口派生:
public interface IRepository : IDisposable
{
void GetData();
}
public class EfRepository : IRepository
{
public void GetData()
{
//DB logic
}
}
public class MongoRepository : IRepository
{
public void GetData()
{
//DB logic
}
}
到目前为止一切顺利。现在,我想根据 appsettings.json 中的“UseMongo”开关来使用任一存储库类。我对依赖注入进行了一些研究,但还没有找到解决方案。我希望能够在我的控制器中执行此操作:
public class ValuesController : Controller
{
private IRepository _repository;
public ValuesController(IRepository repository)
{
_repository= repository;
}
}
这样的事情可行吗?
【问题讨论】:
标签: asp.net-mvc dependency-injection asp.net-core repository