8

注: ここには 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 に関する最後の質問 (上記のコードに少し関係があります) は、オブジェクトの解放に関するものです。このチュートリアルを見ると:

http://codeofrob.com/archive/2010/09/29/ravendb-image-gallery-project-iii-the-application-lifecycle.aspx

最後のコード:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();

このコードのポイントは、セッションのリークを防ぐことです。これは、Autofac についても心配する必要があることです。もしそうなら、Autofac でこれを行うにはどうすればよいですか?

4

2 に答える 2

11

次のようなものが必要だと思います:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope();

「デフォルトの ASP.NET と WCF の統合は、InstancePerLifetimeScope() がコンポーネントを現在の Web 要求またはサービス メソッド呼び出しにアタッチするように設定されています。」- Autofac: InstanceScope

基本的に、Web アプリでInstancePerLifetimeScopeは、HTTP コンテキスト アスペクトごとに 1 つを処理し、実装するすべての型も破棄しますIDisposable

于 2011-04-01T19:23:47.123 に答える
1

OpenSession が DocumentSession ではなく IDocumentSession を返すという問題もありました。ジムが提案したことを実行するとともに、 IDocumentSession を探すようにクラスを変更しました。ありがとうございます。

于 2011-04-03T22:53:06.630 に答える