c# - MongoDatabase 和 MongoCollection 可以是单例吗

标签 c# mongodb .net-core mongodb-.net-driver

我目前正在与 MongoDriver 合作并且,根据 docs ,只有 MongoClient需要是单例。

那讲得通。但是,在研究过程中,我在 SO 上发现了一些旧帖子。 The accepted answer (6岁)这里建议不仅可以MongoServer是单例,但 MongoDatabase 也可以和 MongoCollection .然而,这被 more recent post 反驳。 (2 年前)对于 Java MongoDriver 仅建议 MongoClient应该是单例,因为其他连接可能会过时。

我最初的想法与我链接的最近的帖子有关,即 MongoClient应该是唯一的单例,但考虑到相互矛盾的意见,我只是想确定一下。

谢谢。

最佳答案

我刚刚遇到了同样的问题,找到了微软官方教程,使用 IMongoCollection 作为单例对象中的只读字段,所以以单例方式使用它似乎没有问题。
根据 MongoDB 官方文档:

The implementation of IMongoCollection ultimately provided by a MongoClient is thread-safe and is safe to be stored globally or in an IoC container.

public class BookService
{
    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);
    }

    public List<Book> Get() =>
        _books.Find(book => true).ToList();

    public Book Get(string id) =>
        _books.Find<Book>(book => book.Id == id).FirstOrDefault();

    public Book Create(Book book)
    {
        _books.InsertOne(book);
        return book;
    }

    public void Update(string id, Book bookIn) =>
        _books.ReplaceOne(book => book.Id == id, bookIn);

    public void Remove(Book bookIn) =>
        _books.DeleteOne(book => book.Id == bookIn.Id);

    public void Remove(string id) => 
        _books.DeleteOne(book => book.Id == id);
}
并在服务提供者中注册 BookService
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<BookstoreDatabaseSettings>(
            Configuration.GetSection(nameof(BookstoreDatabaseSettings)));

    services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
        sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);

    services.AddSingleton<BookService>();

    services.AddControllers();
    }
https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-5.0&tabs=visual-studio

关于c# - MongoDatabase 和 MongoCollection 可以是单例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53168675/

相关文章:

c# - .net c# 等待异步事件完成并且代码中仍有 "synchronous"流的最佳方法

c# - 使用 MongoDB 的官方 C# 驱动程序的按位枚举(标志)查询

C# 8 基本接口(interface)的默认方法调用解决方法

javascript - Mongoose 的意外行为

.net - DotNet Core HttpClient 不尊重 Mac 上的代理设置

asp.net-core - Visual Studio 2017 csproj 核心文件排除

c# - 为什么我在调用 RoleEnvironment.GetConfigurationSettingValue ("MYKEY"时收到 SEHException?

c# - 使用 C# 从 Google 搜索中检索数据

node.js - 设计 Mongoose 模型

node.js - 具有多个条件的聚合和基于计数键的总和匹配