【问题标题】:Re-use MongoDB MongoClient in ASP.NET-Core service在 ASP.NET-Core 服务中重用 MongoDB MongoClient
【发布时间】:2020-08-07 14:57:06
【问题描述】:

所以我正在构建一个连接到 mongoDB 实例的 ASP.NET-Core API。我正在阅读有关此主题的 official Microsoft tutorial 并遇到了链接的代码示例。

基本上他们实例化一个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 实例存在的情况下仍然可以工作,因为它知道它被分配到哪个集合以及如何与它通信但mongoDB MongoClient re-use guidelines 建议存储一个全局/静态实例客户端重新使用。 (我猜是因为相同的端口耗尽等原因,您会想要重用 HTTPClients?它还支持内部连接池,这很好!)

进一步思考它们的含义,我确信为我的每个服务实例化并立即为客户端删除一个实例是个坏主意。但是我对这个范围内的 MongoDB 一无所知。

我知道这只是一个教程,它们往往是“快速而肮脏”的编码方式,但由于我对整个主题都是新手,所以我只想确保我能正确开始。

那么,按照“微软的方式”来做这件事可以吗?还是我应该为客户端或工厂创建一个全局实例?

//编辑:

为了澄清:最好在启动时将MongoClient注册为单例并将其注入需要它的类或使用上述方法?

【问题讨论】:

标签: c# mongodb asp.net-core


【解决方案1】:

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

【讨论】:

  • 看起来不错!我可以试试。谢谢!
  • 您能详细说明一下吗?与简单的var client = new MongoClient(connectionStr); services.AddScoped(_ =&gt; client.GetDatabase(dbName): 相比,您的管道有哪些优势?
  • @Nikita Fedorov 优点是您仍然可以在应用程序的其他任何位置访问IMongoClient 的单例实例(如果需要)。
【解决方案2】:

感谢您的分享,我正在做一个 MongoDB 和 .net 核心项目。我有一个包含多个集合的数据库。在创业班

`services.AddSingleton(s => { return new MongoClient(con.ConnectionString).GetDatabase(con.DatabaseName); });`

我的连接字符串和数据库信息存储在我的 appSetting.json 中。现在在我的仓库中,我注入了

mongoDBClient.GetCollection<SomeClass>(GetCollectionNameFromAppSetting((settings.CollectionName)));

既然我有一个数据库,那么将其注册为单例可以吗?或者我应该改变它,谢谢你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2018-12-21
    • 2020-05-07
    • 2018-11-22
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多