首页 > 解决方案 > MongoDatabase 和 MongoCollection 可以是单例吗

问题描述

我目前正在使用,MongoDriver并且根据文档,只MongoClient需要成为单身人士。

那讲得通。但是,在研究时,我在这里遇到了一些关于 SO 的旧帖子。这里接受的答案(它是 6 岁)表明不仅可以MongoServer是单例,MongoDatabase而且MongoCollection. 然而, Java MongoDriver最近的一篇文章(2 年前)反驳了这一点,该文章建议只有MongoClient应该是单例,因为其他连接可能会过时。


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

谢谢。

标签: c#mongodb.net-coremongodb-.net-driver

解决方案


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

最终由 MongoClient 提供的 IMongoCollection 的实现是线程安全的,可以安全地存储在全局或 IoC 容器中。

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


推荐阅读