如何使用 2 个不同的连接字符串在带有 CQRS 的 postgre 中进行读取和写入?

How to use 2 different connection string for read and for writes in postgre with CQRS?

在我们的项目中,我们使用带有 CQRS 和 postgre 的 .net 5.0。 我们所有的应用程序都是容器化的,并在 kubernetes 上运行。对于 postgre,我们有 master -> slave 配置和 pgpool(用于写入),对于读取,它直接从 slaves 获取,但 pgpool 在 master 节点之前配置。

是否可以为 CQRS (MediatR) 配置一个读取连接和另一个写入连接?

我的 DI 配置如下:

        services.AddDbContext<DataContext>(opt =>
        {
            opt.EnableDetailedErrors();
            opt.UseLazyLoadingProxies();
            opt.UseNpgsql(configuration.GetConnectionString("TaikunConnection"),
                options =>
                {
                    options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
                    options.EnableRetryOnFailure();
                    options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
                });
        });

        services.AddScoped<IDataContext>(provider => provider.GetService<DataContext>());

        var builder = services.AddIdentityCore<User>()
            .AddEntityFrameworkStores<DataContext>();

        var identityBuilder = new IdentityBuilder(builder.UserType, builder.Services);
        identityBuilder.AddSignInManager<SignInManager<User>>();
        identityBuilder.AddUserManager<UserManager<User>>();

您可以使用 2 个不同的数据库上下文:

services.AddDbContext<DataWriteContext>(opt =>
        {
            opt.EnableDetailedErrors();
            opt.UseLazyLoadingProxies();
            opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForWrite"),
                options =>
                {
                    options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
                    options.EnableRetryOnFailure();
                    options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
                });
        });

services.AddDbContext<DataReadContext>(opt =>
        {
            opt.EnableDetailedErrors();
            opt.UseLazyLoadingProxies();
            opt.UseNpgsql(configuration.GetConnectionString("TaikunConnectionForRead"),
                options =>
                {
                    options.MigrationsAssembly(typeof(DataContext).Assembly.FullName);
                    options.EnableRetryOnFailure();
                    options.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds);
                });
        });