注: ここには 3 つの質問がありますが、これらはすべて同じコードに多少関連しているため、個別の質問は作成しませんでした。
アプリケーションのライフ サイクルごとに 1 回、Application_Start に RavenDB への接続を登録する次のコードがあります。
var store = new DocumentStore { Url = "http://localhost:8080" };
store.Initialize();
builder.RegisterInstance(store).SingleInstance();
これで問題なく動作し、アプリケーションのライフ サイクルごとに 1 回だけ作成する必要があります。DocumentSession を Autofac に追加したかったので、これを Application_Start に追加しようとしました。
var session = store.OpenSession();
builder.RegisterInstance(session).SingleInstance();
私の UserRepository には、次のコンストラクターがあります。
public UserRepository(DocumentStore store, DocumentSession session)
これを実行しようとすると、次のランタイム エラーが発生します。
コンストラクター 'Void .ctor(Raven.Client.Document.DocumentStore, Raven.Client.Document.DocumentSession)' のパラメーター 'Raven.Client.Document.DocumentSession Session' を解決できません
このエラーは、Autofac が DocumentSession を持っているとは思わないように聞こえますが、それが store.OpenSession() が返すものなので、そうすべきです。このエラーの原因を知っている人はいますか? セッション変数を正しく設定していませんか (問題なく動作するストア変数と同じです)。
上記の問題に関連する場合と関連しない場合がある別のことは、アプリケーションのライフサイクルごとではなく、リクエストごとにオブジェクトのインスタンスを Autofac に追加する方法です。RavenDB DocumentStore オブジェクトはライフ アプリケーション サイクルで 1 回だけ作成する必要がありますが、DocumentSession は要求ごとに 1 回作成する必要があります (アプリケーション レベルごとに作成すると、上記のエラーが発生する可能性があります)。
Autofac に関する最後の質問 (上記のコードに少し関係があります) は、オブジェクトの解放に関するものです。このチュートリアルを見ると:
最後のコード:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
このコードのポイントは、セッションのリークを防ぐことです。これは、Autofac についても心配する必要があることです。もしそうなら、Autofac でこれを行うにはどうすればよいですか?