MongoDatabase和MongoCollection可以是单例吗

时间:2018-11-06 09:02:39

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

我目前正在与MongoDriver合作,据docs称,只有MongoClient必须是单身人士。

这很有道理。但是,在研究期间,我在SO上遇到了一些老帖子。 The accepted answer(已满6岁)在这里建议MongoServer不仅可以是单身人士,MongoDatabaseMongoCollection也可以。但是,Java MongoDriver的more recent post(两年前)对此提出了反驳,该建议建议仅MongoClient应该是单例,因为其他连接会过时。


我最初的想法是与我链接的最新文章保持联系,即MongoClient应该是唯一的东西,但考虑到我只是想确定的矛盾观点。

谢谢。

1 个答案:

答案 0 :(得分:1)

我只是遇到了同样的问题,并找到了Microsoft官方教程,将IMongoCollection用作singleton对象中的只读字段,因此以单例方式使用它似乎没有问题。 根据MongoDB官方文档:

最终提供了IMongoCollection的实现 由MongoClient进行线程安全,并且可以安全地全局存储或 在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