【发布时间】:2013-01-18 01:25:05
【问题描述】:
这里是使用fluent 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();
当我测试上述功能时,它总是在我第一次启动应用程序时工作,但在任何其他时间随机工作。它不起作用的时间,是因为会话为空。我发现如果我在上一次通话结束后等待大约 30 秒,下一次通话就会成功。
为什么要这样做?我正在尝试配置每个线程的会话?
【问题讨论】:
-
不作为 Windows 服务运行时它的工作情况如何? (即你的开发机器?) - 两者有什么不同?
-
@wal 存储库代码通常在 Web 应用程序中运行,但需要在 Windows 服务中批量处理一些数据。我在这个新环境中设置时遇到了麻烦(我没有设置 web 项目,而且 NH 和 StructureMap 对我来说相当陌生,尤其是因为大多数文档都是如何在 web 应用程序中使用它们)。
标签: c# nhibernate session threadpool structuremap