You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中如何通过依赖注入注入两个MongoDB客户端

.NET 8中注入两个不同连接字符串的MongoDB客户端

你直接注册两个IMongoClient的方式会导致DI容器覆盖前一个实例,最终构造函数里拿到的两个客户端其实是同一个。下面提供两种可行的解决方案:

方法一:使用.NET 8原生Keyed服务(推荐)

.NET 8新增了键控服务特性,可以直接通过键来区分同类型的服务实例。

1. 注册带键的MongoClient

在服务配置代码中,用AddKeyedSingleton给两个客户端分别指定唯一键:

// 注册Db1对应的客户端,键为"Db1Client"
services.AddKeyedSingleton<IMongoClient>("Db1Client", _ => 
    new MongoClient(My_Server_Connection1));

// 注册Db2对应的客户端,键为"Db2Client"
services.AddKeyedSingleton<IMongoClient>("Db2Client", _ => 
    new MongoClient(My_Server_Connection2));

2. 在DataStore1中注入带键的服务

在构造函数参数上用[FromKeyedServices]特性指定对应的键,DI容器就会注入匹配的实例:

public class DataStore1
{
    private readonly IMongoDatabase _database1;
    private readonly IMongoDatabase _database2;

    public DataStore1(
        [FromKeyedServices("Db1Client")] IMongoClient clientWithConStr1,
        [FromKeyedServices("Db2Client")] IMongoClient clientWithConStr2)
    {
        _database1 = clientWithConStr1.GetDatabase(DatabaseName1);
        _database2 = clientWithConStr2.GetDatabase(DatabaseName2);
    }
}

方法二:自定义包装类(兼容更早.NET版本)

如果不想依赖.NET 8的Keyed特性,可以创建两个空的包装类来区分不同的客户端:

1. 定义包装类

继承自MongoClient,仅作为标识用:

public class Db1MongoClient : MongoClient
{
    public Db1MongoClient(string connectionString) : base(connectionString) { }
}

public class Db2MongoClient : MongoClient
{
    public Db2MongoClient(string connectionString) : base(connectionString) { }
}

2. 注册包装类实例

services.AddSingleton<Db1MongoClient>(_ => new Db1MongoClient(My_Server_Connection1));
services.AddSingleton<Db2MongoClient>(_ => new Db2MongoClient(My_Server_Connection2));

3. 注入具体包装类

直接在构造函数中注入这两个包装类即可:

public class DataStore1
{
    private readonly IMongoDatabase _database1;
    private readonly IMongoDatabase _database2;

    public DataStore1(Db1MongoClient clientWithConStr1, Db2MongoClient clientWithConStr2)
    {
        _database1 = clientWithConStr1.GetDatabase(DatabaseName1);
        _database2 = clientWithConStr2.GetDatabase(DatabaseName2);
    }
}

内容的提问来源于stack exchange,提问作者O'Neil Tomlinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:54:53