【问题标题】:Using multiple connection strings for the same DBContext对同一个 DBContext 使用多个连接字符串
【发布时间】:2018-08-23 22:58:41
【问题描述】:

我正在开发一个使用 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);

【问题讨论】:

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


    【解决方案1】:

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

    因此我建议将数据库名称作为可选参数(以便您可以使用配置中的默认值,以防请求中未提供数据库名称)到 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
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题。我唯一担心的是每次调用 GetDatabase 方法时都会打开连接吗?
    • @GeshemW 我想数据库连接将由MongoClient 实例维护。因此,多次调用GetDatabase 方法不会有问题。更多信息请参考MongoDB Driver Quick Tour
    • @GeshemW 我刚刚验证了您的担忧并注意到GetDatabase 方法只会创建一个MongoDatabaseImpl 对象,并且只有在执行任何CRUD 操作时才会打开连接。
    • 感谢您的宝贵时间。我会试试这个
    • @GeshemW 当然。 如果它解决了您的问题,请考虑标记答案。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多