Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDatabase和MongoCollection可以是单例吗_C#_Mongodb_.net Core_Mongodb .net Driver - Fatal编程技术网

C# MongoDatabase和MongoCollection可以是单例吗

C# MongoDatabase和MongoCollection可以是单例吗,c#,mongodb,.net-core,mongodb-.net-driver,C#,Mongodb,.net Core,Mongodb .net Driver,我目前正在使用MongoDriver,根据,只有MongoClient需要是单例 这是有道理的。然而,在研究过程中,我在这里偶然发现了一些老帖子。(它已经6年了)这表明,MongoServer不仅可以是单身,而且MongoDatabase和MongoCollection也可以是单身。然而,Java MongoDriver的一个(2年前)版本却反驳了这一点,该版本建议只有MongoClient应该是单例,因为其他连接可能会过时 我最初的想法是站在我最近链接的帖子的一边,MongoClient应该

我目前正在使用
MongoDriver
,根据,只有
MongoClient
需要是单例

这是有道理的。然而,在研究过程中,我在这里偶然发现了一些老帖子。(它已经6年了)这表明,
MongoServer
不仅可以是单身,而且
MongoDatabase
MongoCollection
也可以是单身。然而,Java MongoDriver的一个(2年前)版本却反驳了这一点,该版本建议只有
MongoClient
应该是单例,因为其他连接可能会过时


我最初的想法是站在我最近链接的帖子的一边,
MongoClient
应该是唯一一个单身的东西,但考虑到相互矛盾的观点,我只是想确定一下


谢谢。

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

最终提供了IMongoCollection的实现 MongoClient是线程安全的,并且可以安全地全局或全局存储 在一个IoC容器中

公共类图书服务
{
私人只读IMongoCollection(IMongoCollection)书籍;
公共图书服务(IBookstoreDatabaseSettings)
{
var client=newmongoclient(settings.ConnectionString);
var database=client.GetDatabase(settings.DatabaseName);
_books=database.GetCollection(settings.BooksCollectionName);
}
公共列表Get()=>
_books.Find(book=>true.ToList();
公共图书获取(字符串id)=>
_books.Find(book=>book.Id==Id.FirstOrDefault();
公共图书创建(图书)
{
_图书。InsertOne(图书);
还书;
}
公共作废更新(字符串id,Book bookIn)=>
_books.ReplaceOne(book=>book.Id==Id,bookIn);
公共作废删除(Book bookIn)=>
_books.DeleteOne(book=>book.Id==bookIn.Id);
公共无效删除(字符串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();
    }
public void配置服务(IServiceCollection服务)
{
服务。配置(
GetSection(nameof(BookstoreDatabaseSettings));
services.AddSingleton(sp=>
sp.GetRequiredService().Value);
services.AddSingleton();
services.AddControllers();
}

已经6岁了-好吧,公认的答案可能是错误的。。仅仅因为使用了术语“线程安全”,并不意味着它们是单实例。常见的(跨语言的)模式是“连接”(即MongoClient),至少建议将其作为单例。其他所有内容都应该只是使用范围内的一个实例。@NeilLunn感谢您的确认。正如我所说,我确实希望年龄在其中起作用。与“年龄”无关,但这完全是错误的。在任何阶段,这种说法都不是真的。唯一遗憾的是答案外部链接中的“参考文档”不再存在,以证明它也从未说过这样的话。@NeilLunn啊,好吧。至少文档+最近的问题是正确的。谢谢你的帮助。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则“仅链接”回答可能无效。Mongo文档明确指定只有MongoClient应为Singleton。MongoDatabase或MongoClient是线程安全的,可以全局存储,也可以存储在IoC容器中,我认为这取决于您是否要将其设置为单例。
    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();
    }