1

私の DefaultRegistry には、次の構成があります。

ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext)
        .TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>();

Web アプリケーション フローのある時点で、長い会話を取得するために InstanceScope を HttpSession に変更したいので、次のようにします。

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpSession);

これは初期の InstanceScope を置き換えるようですが、残念ながら現在のリクエストに対してのみ持続します。次の要求が到着すると、初期構成が再びアクティブになり、セッション情報が失われます。

後で、次のような方法で変更を元に戻したいとも考えています。

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpContext);

しかし、一方向に機能させると、おそらく両方で機能します。

実行時に初期 InstanceScope を永久に置き換えることは可能ですか? これはどのように実装する必要がありますか?また、これは長い会話を得る良い方法だと思いますか、それとも StructureMap と NHibernate を使ってそれを行うためのより良い/より簡単な方法はありますか?

4

2 に答える 2

1

長時間実行される会話と UnitOfWork を有効にする方法に関する Ayende の詳細な説明をご覧ください。

http://ayende.com/Wiki/Default.aspx?Page=HttpModules&AspxAutoDetectCookieSupport=1

UnitOfWorkApplication モジュールを作成し、コードが実行される前 (例のようにリクエストが処理される前) に UnitOfWork インスタンスを作成してコンテナーに追加する責任を負うようにすることをお勧めします。このようにして、作業単位の作成方法をより柔軟に制御できます。

于 2009-05-24T14:17:27.160 に答える
0

あなたがやろうとしていることは私には少し奇妙に聞こえます。私が試してみたいルートは

  • StructureMapで名前付きインスタンスを構成します。このインスタンスは、上記のインターフェイスも実装しますが、スコープが異なります。インターフェースコンシューマーごとに異なる依存関係を注入できますが、それは役立つかもしれません。
  • 特定のライフサイクルを効果的に実装する独自のCacheInterceptorを作成します。

後者は、たとえばWCFライフサイクルのためにここで行われます:http://blogs.rpionline.com/post/2009/02/How-to-use-NHibernate-and-StructureMap-in-a-WCF-application.aspx

于 2009-05-24T17:01:09.150 に答える