c# - 在 ASP.NET-Core 服务中重用 MongoDB MongoClient
问题描述
所以我正在构建一个连接到 mongoDB 实例的 ASP.NET-Core API。我正在阅读有关此主题的官方 Microsoft 教程,并遇到了链接的代码示例。
基本上,他们实例化 a并在构造函数的范围内BookService
创建一个新实例。MongoClient
private readonly IMongoCollection<Book> _books;
public BookService(IBookstoreDatabaseSettings settings)
{
var client = new MongoClient(settings.ConnectionString);
var database = client.GetDatabase(settings.DatabaseName);
_books = database.GetCollection<Book>(settings.BooksCollectionName);
}
据我了解,该_books
集合在没有实例存在的情况下仍然可以工作MongoClient
,因为它知道它被分配到哪个集合以及如何与它通信但是mongoDBMongoClient
重用指南建议存储客户端的全局/静态实例以重用。(我猜是由于相同的端口耗尽等原因,您想重新使用 HTTPClients?它还支持内部连接池,这很好!)
进一步思考它们的含义,我很确定为我的每个服务实例化并立即为客户端删除一个实例是一个坏主意。但我对这个范围内的 MongoDB 一无所知。
我知道这只是一个教程,它们往往是“快速而肮脏”的编码方式,但由于我对整个主题都是新手,我只是想确保我能正确开始。
那么以“微软方式”来做这件事可以吗,还是我应该为客户端或工厂创建一个全局实例?
//编辑:
MongoClient
澄清一下:在启动时将其注册为单例并将其注入需要它的类或使用上述方法会更好吗?
解决方案
这就是我通常将 Mongo 添加到我的管道的方式:
services.AddSingleton<IMongoClient>(sp =>
{
var connectionString = "";
return new MongoClient(connectionString);
});
services.AddScoped(sp =>
{
var client = sp.GetRequiredService<IMongoClient>();
var database = "";
return client.GetDatabase(database);
});
这给了我一个作用域IDatabase
实例,我可以在我需要的任何地方注入它(同时只使用一个单例IMongoClient
实例)。
推荐阅读
- mysql - 获取连接的前 3 项
- java - 图片未通过位图从我的画廊上传
- javascript - 使用 css 和 js 在点击时切换图像信息
- javascript - 数据加载后如何将base64数据添加到图像中?(在反应本机中)
- video-streaming - 如何让 Animate CC 播放托管视频?
- c# - 在 asp.net 中如何知道从哪个站点用户被重定向到我们的站点?
- java - 从用户输入中获取元素数量?
- javascript - 更改动态填充表中列的背景颜色 onClick
- python - Python 的 re.findAll() 函数无法按预期工作
- php - 继续浏览而不等待输出到 php