我在 ASP.NET MVC 3 应用程序中使用 SharpArchitecture。一切都很好。
使用 SharpArchitecture 的 NHibernateInitializer 为每个请求初始化一个新的 Session,如下所示:
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 为空。
这是我的问题。如何利用 SharpArchitecture 的 NHibernateSession 并以某种方式拥有它或它的副本,在我的轮询线程中旋转?我希望这可以在不必绕过使用 SharpArchitecture 使用的内置 SessionManagers 和 SessionFactories 的情况下完成。