2

小さな ASP.NET MVC 4 プロジェクトのコーディングを開始しました。ただし、プロジェクトが公開する API から始めたので、これまでのところフロント エンドはありません。API は、Web API の API コントローラーを使用して作成されます。API コントローラーは、Raven DB データベースに格納されたデータにアクセスします。VS 2012 と IIS Express を使用してコードをデバッグすると、すべて正常に動作します。つまり、最初の要求の間です。2 番目の要求では、Raven DB の IDocumentStore オブジェクト (つまり、データベース接続オブジェクト) が破棄されましたが、それがどのように発生したのかわかりません。

Ninject を使用してIDocumentStoreオブジェクトをリポジトリ オブジェクトに挿入します。Ninject は次のように設定されます。

public class NinjectModule: Ninject.Modules.NinjectModule {
    readonly string _connStrName;

    IDocumentStore _store;

    public NinjectModule(string connStrName) {
        _connStrName = connStrName;
    }

    public override void Load() {
        _store = new DocumentStore { ConnectionStringName = _connStrName };
        _store.Initialize();

        Bind<IDocumentStore>().ToConstant(_store);
    }

    public override void Unload() {
        _store.Dispose();

        base.Unload();
    }
}

はメソッドIDocumentStoreで破棄されますUnloadが、私が知る限り、Unloadメソッドは呼び出されません。

誰かが私が破棄される理由を教えてくれたら素晴らしいですが、IDocumentStore実際に破棄されたときにデバッグする方法に落ち着きます。特定のオブジェクトが破棄されたときにトリガーできますか?

私は非常に注意深くチェックしましたが、IDocumentStoreオブジェクトは私の(まだ非常に小さい)コードベースによって破棄されることはありません。

4

1 に答える 1

0

これが問題かどうかはわかりIDocumentStoreませんが、RavenDB には単一インスタンスのライフタイム スコープがIDocumentSession必要ですが、a にはリクエストごとのスコープが必要です。

私自身 AutoFac を使用していますが、Ninject でライフタイム スコープを定義する方法を簡単に検索すると、このページが表示されました。

.InSingletonScope()に適切な場所に追加してみてIDocumentStore、問題が解決するかどうかを確認してください。

セッションに Ninject を使用する場合は.InRequestScope()、適切なオプションのようです。

于 2013-01-23T23:38:45.927 に答える