ASP.NET MVC 3 アプリケーションで SharpArchitecture を使用しています。すべてが素晴らしく機能します。
SharpArchitecture の NHibernateInitializer を使用して、次のようにリクエストごとに新しいセッションを初期化します。
protected void Application_BeginRequest(object sender, EventArgs e)
{
NHibernateInitializer.Instance().InitializeNHibernateOnce(InitializeNHibernateSession);
}
private void InitializeNHibernateSession(ISessionStorage sessionStorage)
{
NHibernateSession.ConfigurationCache = new NHibernateConfigurationFileCache(
new[] { "App.Core" });
NHibernateSession.Init(
sessionStorage,
new[] { Server.MapPath("~/bin/" + ApplicationSettings.Instance.NHibernateMappingAssembly) },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/NHibernate.config"));
NHibernateSession.AddConfiguration(ApplicationSettings.NHIBERNATE_OTHER_DB,
new[] { Server.MapPath("~/bin/" + ApplicationSettings.Instance.NHibernateMappingAssembly) },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/NHibernateForOtherDb.config"), null, null, null);
}
ご覧のとおり、複数のデータベースにもアクセスしています。大丈夫です。
ここで私は問題に遭遇します。
データベースのポーリング メカニズムを実行するには、別のスレッドを起動する必要があります。私の意図は、次のようなことをすることでした:
protected void Application_Start()
{
....
ThreadingManager.Instance.ExecuteAction(() =>
{
// initialize another NHibernateSession within SharpArchitecture somehow
NHibernateInitializer.Instance().InitializeNHibernateOnce(InitializeNHibernateSession);
var service = container.Resolve<IDatabaseSynchronizationService>();
service.SynchronizeRepositories();
});
}
そして、SynchronizationService を通じて、いくつかのリポジトリが呼び出されます。明らかに、セッションにアクセスしようとすると、Session が null であるため例外がスローされます。
これが私の質問です。SharpArchitecture の NHibernateSession を活用して、それまたはそのコピーをポーリング スレッド内でスピンアップするにはどうすればよいですか? SharpArchitecture で使用される組み込みの SessionManagers と SessionFactories を使用してバイパスすることなく、これを実行できることを願っています。