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

时间:2018-08-23 22:58:42

标签: c# dependency-injection .net-core mongodb-.net-driver

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

当前系统如何工作

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

现在,我必须对其进行增强,它将有多个数据库,并且应该根据API请求将数据保存在相关的数据库中(我将在API请求中获取数据库名称)。

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

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

这是我的DbContext类

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);
    }...

我的StartUp类的一部分

services.AddTransient<CareHomeContext>();

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

我希望这会有所帮助。