为同一个 DBContext 使用多个连接字符串

Using multiple connection strings for the same DBContext

我正在开发一个 asp.net 核心项目,它使用 MongoDB,我也在使用依赖注入。

当前系统如何工作

只有一个数据库,连接字符串保存在appsettings.json中。一些设备会不断地通过 API 发送数据以将其保存在 MongoDB 数据库中,该数据库可以正常工作:)

现在我要加强它,会有多个数据库,数据应该根据API请求保存在相关数据库中(我将在API中获取数据库名称要求)。

我的问题是如何根据 API 请求更改数据库?同时使用相同的 DbContext。不能选择创建多个 DbContext。

我对 MongoDb 和 asp.net 核心有些陌生,因此非常感谢任何帮助或指导。

这是我的 DbContext class

public class DbContext
{
    private IMongoDatabase _database;
    protected readonly MongoClient mongoClient;

    public DbContext(MongoSetting dbConnSettings)
    {
        var mongoUrl = new MongoUrl(dbConnSettings.ConnectionString);
        var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl);

        mongoClient  = new MongoClient(mongoClientSettings);
        if (mongoClient != null)
            _database = mongoClient.GetDatabase(dbConnSettings.database);
    }...

我的启动部分class

services.AddTransient<CareHomeContext>();

services.AddSingleton(provider => provider.GetService<IOptions<MongoSetting>>().Value);

如果我正确理解您的用例,可能还需要在每个请求中使用不同的数据库。

因此,我建议将数据库名称作为可选参数(以便您可以使用配置中的默认值,以防请求中未提供数据库名称)到 DbContext class 方法并在 DbContext class 中创建一个方法来获取数据库对象(而不是在构造函数中获取它),如下所示。

private IMongoDatabase GetDatabase(string databaseName) => mongoClient.GetDatabase(databaseName ?? defaultDatabaseName);

在每个DbContext class方法中调用上述方法。例如

public async Task InsertAsync(string collectionName, Dictionary<string, object> fields, string databaseName = null) {
   var database = GetDatabase(databaseName);
   // Insert Code here
}

希望对您有所帮助。