c# - MongoDatabase 和 MongoCollection 可以是单例吗
问题描述
我目前正在使用,MongoDriver
并且根据文档,只MongoClient
需要成为单身人士。
那讲得通。但是,在研究时,我在这里遇到了一些关于 SO 的旧帖子。这里接受的答案(它是 6 岁)表明不仅可以MongoServer
是单例,MongoDatabase
而且MongoCollection
. 然而, Java MongoDriver最近的一篇文章(2 年前)反驳了这一点,该文章建议只有MongoClient
应该是单例,因为其他连接可能会过时。
我最初的想法与我链接的最近的帖子有关,MongoClient
应该是唯一的单身人士,但考虑到相互矛盾的意见,我只是想确定一下。
谢谢。
解决方案
我刚刚遇到同样的问题,发现微软官方教程,使用 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();
}
推荐阅读
- android - 如何更改扩展浮动操作按钮的形状?
- javascript - 如何返回可以拆分数组的位置,使得一侧的总和等于另一侧
- javascript - 在代理中调用console.log()时访问方法startsWith抛出错误
- c# - 将对象转换为 ValueTuple
- c# - 我如何从 .net 核心中的 ASYNC SOAP Web 服务获得响应?
- python - 使用 EWS-office 365 发送电子邮件(当 IMAP 和 POP 3 均不可用时)?
- javascript - 优化代码以加快执行速度
- java - 为什么在 Java 中打印 0100 会打印 64?
- c++ - 为什么从采用 std::ranges::output_range 的算法中返回 std::ranges::safe_iterator_t 而不是 std::ranges::safe_subrange_t
- c++ - 错误 C2227:“->yr”的左侧必须指向类/结构/联合/通用类型