StructureMap从线程局部范围返回已处置的nHibenrate会话对象

kap*_*tan 7 .net structuremap nhibernate multithreading quartz.net

[OR]如何为http请求和石英作业使用UoW定义StructureMap生命周期

我有这个使用SM for IoC的Web应用程序.我正在使用HybridHttpOrThreadLocalScoped范围来存储我的nHibernate ISession对象.这适用于我的Web请求的每个请求时段的会话.

但我也有quartz.net安排几个工作.该作业使用相同的工作单元来获取ISession对象.在这种情况下,当调度程序启动作业时,一切正常,并且作业运行良好几次UNTIL作业线程ID重复.

想象一下,当作业被安排时,它开始在具有id 11,12,13的线程中运行,然后再次使用线程ID 11.此时,structuremap返回一个已经处理好的会话对象,我得到"System.ObjectDisposedException:Session is closed!" 错误.

因此,从我所看到的,会话保存在线程本地存储中,在我的工作单元结束后处理会话后,会话对象仍保留在线程本地存储中.似乎在线程终止之后它的本地存储没有被清除,并且当某个新的线程具有相同的id时,structmap会查找旧线程本地存储中的会话(应该为新线程清除我认为并返回已经处理的会话对象.

问题:

  1. 有没有办法清除线程本地存储(终止时)?
  2. 对于线程范围的对象,是否存在等效的"ReleaseAndDisposeAllHttpScopedObjects"?
  3. 有没有办法使处置的对象无效(或弹出),所以即使SM找到它然后它也找不到任何东西并且必须创建一个新的实例?

我希望我明白我的问题.这花费了我几个小时的时间,但我还没有找到解决办法.我很欣赏任何提示:>

更新: 我添加了自己的解决方案,使StructureMap服务的UoW同时处理http请求和石英作业.如果您有更好/更容易/更简单的解决方案,请告诉我.

rcr*_*ens 1

为什么不为石英作业创建一个新会话?工作单元通常是数据库上的事务操作。我无法想象石英作业在事务上与网络请求/响应相关。创建新会话并不昂贵。这有可能吗?