.NET Core中如何实现MongoDB全局连接与通用集合获取?
.NET Core + MongoDB 全局连接复用与通用集合获取方案
1. 实现全局复用的通用数据库连接
MongoClient本身是线程安全的,官方强烈推荐单例模式使用,避免重复创建连接造成资源浪费。按以下步骤配置全局复用连接:
步骤1:定义配置映射类
创建与appsettings.json配置对应的实体类:
public class MongoDBSettings { public string ConnectionString { get; set; } = string.Empty; public string DatabaseName { get; set; } = string.Empty; }
步骤2:配置appsettings.json
在配置文件中添加MongoDB连接信息:
{ "MongoDBSettings": { "ConnectionString": "mongodb://localhost:27017", "DatabaseName": "YourBusinessDB" } }
步骤3:注册单例服务
在Program.cs中将MongoClient和IMongoDatabase注册为单例,确保全局复用:
// 绑定配置 builder.Services.Configure<MongoDBSettings>(builder.Configuration.GetSection("MongoDBSettings")); // 注册单例MongoClient builder.Services.AddSingleton<IMongoClient>(sp => { var settings = sp.GetRequiredService<IOptions<MongoDBSettings>>().Value; return new MongoClient(settings.ConnectionString); }); // 注册单例IMongoDatabase builder.Services.AddSingleton<IMongoDatabase>(sp => { var client = sp.GetRequiredService<IMongoClient>(); var dbSettings = sp.GetRequiredService<IOptions<MongoDBSettings>>().Value; return client.GetDatabase(dbSettings.DatabaseName); });
之后所有业务服务只需通过依赖注入获取IMongoDatabase,无需重复创建MongoClient。
2. 通过通用逻辑获取数据库集合实例
可以通过通用仓储基类或直接注入集合两种方式实现,避免重复编写集合获取代码:
方式1:通用仓储基类(推荐)
封装通用的集合获取逻辑,业务服务直接继承即可复用:
// 自定义集合名特性(可选,用于覆盖默认类名作为集合名) [AttributeUsage(AttributeTargets.Class)] public class MongoCollectionAttribute : Attribute { public string CollectionName { get; } public MongoCollectionAttribute(string collectionName) => CollectionName = collectionName; } // 通用仓储基类 public class BaseRepository<T> where T : class { protected readonly IMongoCollection<T> Collection; public BaseRepository(IMongoDatabase database) { // 优先使用特性指定的集合名,否则用实体类名 var collectionAttr = typeof(T).GetCustomAttribute<MongoCollectionAttribute>(); var collectionName = collectionAttr?.CollectionName ?? typeof(T).Name; Collection = database.GetCollection<T>(collectionName); } // 可封装通用CRUD方法,减少重复代码 public async Task<T?> GetByIdAsync(string id) { return await Collection.Find(x => x.Id == id).FirstOrDefaultAsync(); } }
业务服务使用示例
// 实体类(可选标记自定义集合名) [MongoCollection("Orders")] public class Order { public string Id { get; set; } = ObjectId.GenerateNewId().ToString(); public string UserId { get; set; } = string.Empty; // 其他业务属性... } // 订单业务服务,继承基类 public class OrderService : BaseRepository<Order> { public OrderService(IMongoDatabase database) : base(database) { } // 订单专属业务方法 public async Task<List<Order>> GetOrdersByUserIdAsync(string userId) { return await Collection.Find(x => x.UserId == userId).ToListAsync(); } }
最后在Program.cs注册业务服务:
builder.Services.AddScoped<OrderService>();
方式2:直接注入IMongoCollection
如果不需要通用CRUD方法,也可以直接在DI中注册指定集合:
builder.Services.AddScoped<IMongoCollection<Order>>(sp => { var database = sp.GetRequiredService<IMongoDatabase>(); return database.GetCollection<Order>("Orders"); });
业务服务中直接注入使用:
public class OrderService { private readonly IMongoCollection<Order> _orderCollection; public OrderService(IMongoCollection<Order> orderCollection) { _orderCollection = orderCollection; } // 业务方法... }
内容的提问来源于stack exchange,提问作者Fahad Subzwari
相关产品推荐
相关产品推荐

