了解 Dot 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>();
}

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

将所有与数据库相关的东西保存在一个称为存储库(存储库模式(的类中要好得多,该类封装了所有这些内容并使外部世界忘记了细节 - 一旦你给它一个接口,你可以很容易地把它放在一个 IoC 容器中并换掉它(例如,用于单元测试(。您需要为域的不同区域使用不同的存储库。

最终,您还需要研究工作单元模式,了解涉及跨不同存储库的事务的更高级方案。

最新更新