MVC 4プロジェクトでNServiceBus(3.2.2)、RavenDB(1.2.2017-Unstable)、Windsor(3.0.0.4001)を使用しています。NserviceBusのWindsorでRavenDbセッションを管理する
私は3種類のメッセージを処理IHandleMessagesクラスを持って、そしてそれがIDocumentSessionが必要で、そのためのようなプロパティを定義しています。私はNServiceBus' website
からRavenDbUnitOfWorkの実装をコピーしたpublic IDocumentSession DocumentSession { get; set; }
私は次のように私のウィンザーコンテナにIDocumentStore、IDocumentSessionとIManageUnitsOfWorkを登録しました:
container.Register(
Component
.For<IManageUnitsOfWork>()
.ImplementedBy<RavenUnitOfWork>()
.LifestyleTransient()
);
container.Register(
Component
.For<IDocumentStore>()
.UsingFactoryMethod(k => DocumentStoreHolder.DocumentStore)
.LifestyleSingleton(),
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleTransient()
);
NServiceBusは私のコンテナを使用するように設定されています。私はUnitOfWorkのとメッセージハンドラはDocumentSessionの異なるインスタンスを受け取る問題が発生してい
Configure.With()
.CastleWindsorBuilder(container);
。これは、SaveChanges()が別のDocumentSessionで呼び出されるため、メッセージハンドラのセッションに格納されているオブジェクトは保存されないことを意味します。
一時的なライフスタイルを削除すると、メッセージハンドラがDocumentSessionの同じインスタンスを取得し続けるため、RavenDbからオブジェクトを更新するときに並行性/競合が発生するさまざまな種類の問題が発生します。オブジェクト。
更新:
示唆したように、私はこのように、スコープのライフスタイルに、ウィンザーにIDocumentSessionの登録を変更しようとしました:とき、コンテナの試行
Component
.For<IDocumentSession>()
.UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
.LifestyleScope()
これは、例外が発生スコープが見つからないと言ってMVCコントローラを解決し、BeginScope()を呼び出すのを忘れたかどうかを尋ねる。
あなたはDocumentStoreHolderに定義を追加することができます。nservicebusへ? –