27

MongoServer クラスのライフ サイクルを管理するためのベスト プラクティスは何ですか? 作成して各リクエストの最後に閉じる必要がありますか、それとも StructureMap のようなものを使用して、アプリの全期間にわたってシングルトンとして保持する必要がありますか?

どんな助けでも大歓迎です。

4

3 に答える 3

24

公式ドキュメントでは、MongoServerMongoDatabase、およびMongoCollectionはスレッドセーフであり、MongoServer接続するデータベースごとに 1 つのシングルを作成する必要があると記載されています。

したがってMongoServer、、、MongoDatabaseおよびMongoCollectionシングルトンとして安全に構成できます。連続する呼び出しに対してMongoServer同じインスタンスを返すことでこれを強制するのに役立ち、sに対しても同じことを行います。MongoDatabaseMongoDatabaseMongoCollection

つまり、インスタンスは、MongoServerIoC コンテナーでシングルトン ライフスタイルを持つように安全に構成できます。MongoDatabaseMongoCollection

私は自分自身でウィンザーでこの戦略を使用しています - あなたは私のMongoInstallerここを見ることができます: https://gist.github.com/2427676 - それは私のクラスが先に進んでこれを行うことを可能にします:

public class SomeClass
{
    public SomeClass(MongoCollection<Person> people)
    { ... }
}

コレクションを注入し、すぐに使用できるようにします。

于 2012-04-20T10:35:17.440 に答える
8

C# ドライバーは、サーバーへの接続を自動的に管理します (接続プールを使用します)。ドライバーが自動的に接続するため、server.Connect を呼び出す必要はありません。server.Disconnect を呼び出さないでください。接続プール内のすべての接続が閉じられ、効率的な接続プールが妨げられるためです。

MongoServer インスタンスのライフサイクルを管理する限り、それを静的変数に自由に格納して、プロセスの存続期間中使用できます (スレッド間で共有するため、スレッドセーフです)。または、サーバー インスタンスを取得する必要があるときはいつでも、MongoServer.Create を再度呼び出すことができます。同じ接続文字列で MongoServer.Create を呼び出し続ける限り、同じ MongoServer インスタンスを取得し続けます。

于 2012-04-21T13:57:12.160 に答える
3

任意のIOCコンテナー(構造マップ、ウィンザーなど)を使用して注入し、要求ごとにその存続期間を維持します。

于 2012-04-20T07:29:23.887 に答える