これは、流暢な StructureMap を使用した NH の関連構成です。
ISessionFactory sessionFactory = fluentConfig.BuildSessionFactory();
For<Configuration>().LifecycleIs(new HybridLifecycle()).Singleton().Use(configuration);
For<ISessionFactory>().LifecycleIs(new HybridLifecycle()).Singleton().Use(sessionFactory);
For<ISession>().LifecycleIs(new ThreadLocalStorageLifecycle())
.Use(x => x.GetInstance<ISessionFactory>().OpenSession());
For<IUnitOfWork>().LifecycleIs(new ThreadLocalStorageLifecycle())
.Use<UnitOfWork>();
NH セッションは UnitOfWork オブジェクトにカプセル化されます。
私のWindowsサービスでは、セッションにアクセスするたびに、次のようにセッションを呼び出すスレッドプールスレッド内にあります。
unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();
...
//Init repositories with the unitOfWork
//Have repos do their thing
...
unitOfWork.Commit();
unitOfWork.Dispose();
上記の機能をテストしているとき、アプリケーションを初めて起動したときは常に機能しますが、それ以外のときはランダムに機能します。うまくいかない時は、セッションがnullだからです。前の呼び出しが終了してから約 30 秒待つと、次の呼び出しが成功することがわかりました。
なぜそれをするのでしょうか?スレッドごとにセッションを構成しようとしていますか?