0

同じ方針に沿ったCastlewindsorチュートリアルに従って、nhibernateの永続化機能を実装しました。

見る:

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Seven-Lifestyles.ashx

私は自分のアプリケーションで、プールが解放されて再度アクセスしようとすると、構築中のセッションファクトリに関連するエラーが最初に発生することに気づきました。

重複キーが追加されたなど。

それは私のマッピングとは関係がなく、施設が実行される方法や時期と関係があると思います。

さらにいくつかの調査を行った後、セッションファクトリはスレッドセーフである必要があると人々が言っ​​ているのを目にしますか?

これが正しければ、実行されるコードが1回だけ実行されることを保証するために、Castle Windsorだけに頼ることはできないというのが私の仮定ですか?

永続ファシリティの以下のinitメソッドを確認してください。initメソッドにさらにレベルのロックを追加する必要がありますか?

そして、これはそれを行うための正しい場所でしょうか?

私の施設-チュートリアルに従います:

public class PersistenceFacility : AbstractFacility
{
    // ... etc.

    protected override void Init()
    {
        Configuration config = BuildDatabaseConfiguration();

        Kernel.Register(Component.For<ISessionFactory>().UsingFactoryMethod(_ => config.BuildSessionFactory()).LifestylePerWebRequest());
        Kernel.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()).LifestylePerWebRequest());
    }
}

App_Startでコンテナを初期化しますが、特別なことは何もしません。リポジトリからISessionを使用するだけで、すべてCastleWindsorを使用して解決されます。

4

1 に答える 1

0

Windsorは、施設をコンテナに追加した回数とまったく同じ回数、すべての施設を初期化します。

したがって、一度実行すると、一度初期化され、そこにロックをかける必要はありません。

コードで奇妙に見えるのは、リクエストごとにセッションファクトリを再作成しているという事実だけです。

于 2013-02-11T08:05:41.303 に答える