首页 > 解决方案 > 在 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澄清一下:在启动时将其注册为单例并将其注入需要它的类或使用上述方法会更好吗?

标签: c#mongodbasp.net-core

解决方案


这就是我通常将 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实例)。


推荐阅读