几天前,我遇到了 ASP.Net 线程问题。我希望每个 Web 请求都有一个单例对象。我的工作单元实际上需要这个。我想为每个 Web 请求实例化一个工作单元,以便身份映射在整个请求中都是有效的。这样,我可以使用 IoC 将我自己的 IUnitOfWork 透明地注入到我的存储库类中,并且我可以使用相同的实例来查询然后更新我的实体。
由于我使用的是 Unity,所以我错误地使用了 PerThreadLifeTimeManager。我很快意识到 ASP.Net 线程模型不支持我想要实现的目标。基本上它使用一个线程池并回收线程,这意味着我每个线程得到一个 UnitOfWork !但是,我想要的是每个 Web 请求一个工作单元。
一点谷歌搜索给了我这个很棒的帖子。这正是我想要的。除了很容易实现的统一部分。
这是我对 PerCallContextLifeTimeManager 的统一实现:
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());
希望它可以节省一些时间。