几天前,我遇到了一个关于ASP.NET线程的问题.我希望每个Web请求都有一个单例对象.我的工作单位确实需要这个.我想 for each Web请求实例化一个工作单元,这样身份映射在整个请求过程中都是有效的.这样,我就可以使用IOC透明地将我自己的IUnitOfWork注入到我的存储库类中,并且我可以使用相同的实例来查询和更新我的实体.
因为我使用的是Unity,所以我错误地使用了PerThreadLifeTimeManager.我很快意识到ASP.Net线程模型不支持我想要实现的目标.基本上,它使用一个线程池并回收线程,这意味着我每个线程有一个工作单元!!然而,我想要的是每个web请求一个工作单元.
在谷歌上搜索一下,我得到了this great post分.这正是我想要的;除了很容易实现的统一部分.
这是我对PerCallContextLifeTimeManager for unity的实现:
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
当然,我用这个来注册我的工作单元,代码如下:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
希望这能为某人节省一点时间.