我正在使用优秀的数据库库NReco.Data进行我正在使用MVC Core进行的新MVC项目。
我正在尝试尽可能多地使用依赖注入。但是,让我感到困惑的是这个。根据我的 Startup.cs 中的以下代码,如何实例化另一个指向不同数据库(或连接字符串(的DbDataAdapter
?
public void ConfigureServices(IServiceCollection services)
{
var dbconnectStringAppSettings = Configuration["DBConnectString"];
services.AddDbContext<MisoIRListservDbContext>(options => options.UseSqlServer(dbconnectStringAppSettings));
InjectNRecoDataService(services);
// Repositories
services.AddScoped<ListSettingRepository>();
services.AddScoped<ListCategoryRepository>();
services.AddScoped<MailingListRepository>();
services.AddScoped<LISTSERVRepository>();
// Services
services.AddScoped<ListServEmailMailingListService>();
services.AddScoped<ListCategoryMailingListService>();
services.AddMvc();
}
private void InjectNRecoDataService(IServiceCollection services)
{
services.AddSingleton<IDbFactory, DbFactory>(servicePrv => new DbFactory(SqlClientFactory.Instance)
{
LastInsertIdSelectText = "SELECT @@IDENTITY"
});
services.AddSingleton<IDbCommandBuilder, DbCommandBuilder>(servicePrv =>
{
var dbCmdBuilder = new DbCommandBuilder(servicePrv.GetRequiredService<IDbFactory>());
return dbCmdBuilder;
});
services.AddScoped<IDbConnection>(servicePrv =>
{
var dbCoreContext = servicePrv.GetRequiredService<MisoIRListservDbContext>();
var conn = dbCoreContext.Database.GetDbConnection();
return conn;
});
services.AddScoped<DbDataAdapter>();
}
我的观点是,特定于数据库的东西(如SQL连接(不应该放在IoC容器中; 这导致了您面临的重用问题,以及管理其生命周期的其他问题。
将所有与数据库相关的东西保存在一个称为存储库(存储库模式(的类中要好得多,该类封装了所有这些内容并使外部世界忘记了细节 - 一旦你给它一个接口,你可以很容易地把它放在一个 IoC 容器中并换掉它(例如,用于单元测试(。您需要为域的不同区域使用不同的存储库。
最终,您还需要研究工作单元模式,了解涉及跨不同存储库的事务的更高级方案。