了解Dot Net Core中数据库连接的依赖注入

时间:2017-03-27 12:24:09

标签: c# asp.net-core-mvc .net-core

我正在使用优秀的数据库库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>();
}

1 个答案:

答案 0 :(得分:1)

我的观点是SQL连接等特定于数据库的东西不应该进入IoC容器;这导致了您所面临的重用问题,以及管理其生命周期的其他问题。

将所有与数据库相关的东西保存在名为存储库(存储库模式)的类中要好得多,它会封装所有这些并使外部世界忘记细节 - 一旦你给出它是一个接口,您可以轻松地将其放入IoC容器中并将其交换出来(例如,用于单元测试)。您希望为域的不同区域设置不同的存储库。

最终,您还需要查看涉及不同存储库之间事务的更高级方案的工作单元模式。