Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 在web应用程序中管理MongoDB对象生存期_C#_.net_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 在web应用程序中管理MongoDB对象生存期

C# 在web应用程序中管理MongoDB对象生存期,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我有一个使用mongodb作为底层存储的RESTful后端。我用的是c#driver。文档说明mongo自行管理其连接池 问题是:要与mongodb通信,我需要以下实现的实例 IMongoClient IMongoDatabase IMongoCollection 管理这些对象的生命周期的最佳实践是什么?我可以使用每台服务器的singleton lifestyle(appdomain)存储它们,也可以根据请求不断创建它们。目前,每个请求仅提供IMongoCollection。建议的方法是保存

我有一个使用mongodb作为底层存储的RESTful后端。我用的是c#driver。文档说明mongo自行管理其连接池

问题是:要与mongodb通信,我需要以下实现的实例

  • IMongoClient
  • IMongoDatabase
  • IMongoCollection

管理这些对象的生命周期的最佳实践是什么?我可以使用每台服务器的singleton lifestyle(appdomain)存储它们,也可以根据请求不断创建它们。目前,每个请求仅提供
IMongoCollection

建议的方法是保存单个
MongoClient
实例,并在需要时使用它获取数据库和集合

如果这些实例对您的性能至关重要,您可能会主动缓存这些实例,但在大多数情况下,这是不必要的,因为所有这些类型都非常简单,创建成本也很低。例如,这是
GetCollection
方法:

public override IMongoCollection<TDocument> GetCollection<TDocument>(string name, MongoCollectionSettings settings)
{
    Ensure.IsNotNullOrEmpty(name, "name");

    settings = settings == null ?
        new MongoCollectionSettings() :
        settings.Clone();

    settings.ApplyDefaultValues(_settings);

    return new MongoCollectionImpl<TDocument>(this, new CollectionNamespace(_databaseNamespace, name), settings, _cluster, _operationExecutor);
}
public覆盖IMongoCollection GetCollection(字符串名称,MongoCollectionSettings)
{
确保.IsNotNullOrEmpty(name,“name”);
设置=设置=空?
新建MongoCollectionSettings():
settings.Clone();
设置。ApplyDefaultValue(_设置);
返回新的MongoCollectionImpl(这是新的CollectionNamespace(_databaseNamespace,name)、设置、_群集、_operationExecutor);
}
除了一些参数处理和一些分配,这里实际上什么都没有做。真正昂贵的是连接池,而且(正如您所提到的)它是由驱动程序内部处理的