- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
[或] 如何为 http 请求和 quartz 作业使用的 UoW 定义 StructureMap 生命周期
我有这个使用 SM 进行 IoC 的 Web 应用程序。我正在使用 HybridHttpOrThreadLocalScoped 范围来存储我的 nHibernate ISession 对象。对于我的 Web 请求,这在每个请求的 session 中都可以正常工作。
但我也有quartz.net 来安排几个工作。该作业使用相同的工作单元来获取 ISession 对象。在这种情况下,当调度程序启 Action 业时,一开始一切正常,作业运行良好几次,直到作业线程 id 重复为止。
想象一下,当作业被调度时,它开始在 ID 为 11、12、13 的线程中运行,然后再次以线程 ID 11 运行。此时,结构映射返回一个已经被处理的 session 对象,我得到“System.ObjectDisposedException: Session is closed!”错误。
因此,从我所见, session 保存在线程本地存储中,在我的工作单元结束时处理 session 后, session 对象仍保存在线程本地存储中。 似乎在线程终止后,它的本地存储并未清除,并且以某种方式创建具有相同 id 的新线程时,structuremap 在旧线程本地存储中查找 session (应该为我相信的新线程清除)并返回已经处理的 session 对象。
问题:
最佳答案
我正在重新审视我为使 StructureMap 与 UoW per Http 和 UoW perquartz 工作一起工作所做的工作,我决定在这里分享我的解决方案。
所以我的想法是,当有 http 上下文时,我想使用 StructureMap Hybrid 范围来获取 UoW 的实例,并在没有 http 上下文时(例如,当 quartz 作业触发时)为每个线程获取不同的 UoW 实例。像这样:
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
public class HybridHttpQuartzLifecycle : HttpLifecycleBase<HttpContextLifecycle, QuartzLifecycle>
{
public override string Scope { get { return "HybridHttpQuartzLifecycle"; } }
}
public class QuartzLifecycle : ILifecycle
{
public void EjectAll()
{
FindCache().DisposeAndClear();
}
public IObjectCache FindCache()
{
return QuartzContext.Cache;
}
public string Scope { get { return "QuartzLifecycle"; } }
}
public class QuartzContext
{
private static readonly string _cacheKey = "STRUCTUREMAP-INSTANCES";
[ThreadStatic]
private static JobExecutionContext _jobExecutionContext;
protected static void Register(JobExecutionContext jobExecutionContext)
{
_jobExecutionContext = jobExecutionContext;
_jobExecutionContext.Put(_cacheKey, new MainObjectCache());
}
public static IObjectCache Cache
{
get
{
return (IObjectCache)_jobExecutionContext.Get(_cacheKey);
}
}
}
abstract class BaseJobSingleSession : QuartzContext, IStatefulJob
{
public override void Execute(JobExecutionContext context)
{
Register(context);
IUnitOfWork unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();
try
{
unitOfWork.Begin();
// do stuff ....
unitOfWork.Commit();
}
catch (Exception exception)
{
unitOfWork.RollBack();
}
finally
{
unitOfWork.Dispose();
}
}
}
For<IUnitOfWork>().LifecycleIs(new HybridHttpQuartzLifecycle()).Use<UnitOfWork>();
关于.net - StructureMap 从线程本地范围返回一个已处理的 nHibenrate session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169989/
[或] 如何为 http 请求和 quartz 作业使用的 UoW 定义 StructureMap 生命周期 我有这个使用 SM 进行 IoC 的 Web 应用程序。我正在使用 HybridHttpO
我是一名优秀的程序员,十分优秀!