我目前正在与MongoDriver
合作,据docs称,只有MongoClient
必须是单身人士。
这很有道理。但是,在研究期间,我在SO上遇到了一些老帖子。 The accepted answer(已满6岁)在这里建议MongoServer
不仅可以是单身人士,MongoDatabase
和MongoCollection
也可以。但是,Java MongoDriver的more recent post(两年前)对此提出了反驳,该建议建议仅MongoClient
应该是单例,因为其他连接会过时。
我最初的想法是与我链接的最新文章保持联系,即MongoClient
应该是唯一的东西,但考虑到我只是想确定的矛盾观点。
谢谢。
答案 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();
}