.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
相关产品推荐
相关产品推荐

