【发布时间】:2010-11-12 04:18:53
【问题描述】:
几天前,我遇到了 ASP.Net 线程问题。我希望每个 Web 请求都有一个单例对象。我的工作单元实际上需要这个。我想为每个 Web 请求实例化一个工作单元,以便身份映射在整个请求中都是有效的。这样,我可以使用 IoC 将我自己的 IUnitOfWork 透明地注入到我的存储库类中,并且我可以使用相同的实例来查询然后更新我的实体。
由于我用的是Unity,所以误用了PerThreadLifeTimeManager。我很快意识到 ASP.Net 线程模型不支持我想要实现的目标。基本上它使用一个线程池并回收线程,这意味着我每个线程得到一个 UnitOfWork !但是,我想要的是每个 Web 请求一个工作单元。
有点谷歌搜索给了我this great post。这正是我想要的。除了很容易实现的统一部分。
这是我对 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());
希望它可以节省一些时间。
【问题讨论】:
-
不错的解决方案。如果可以的话,我建议将其重命名为“CallContextLifetimeManager”,因为 Web 请求可能只是潜在应用程序之一。
-
没错,我更新了文本和代码以反映这一点。谢谢。
-
使用 PerResolveLifetimeManager 有什么问题?
-
这不是问题!?
-
仅供参考,这不是问题的“正确”答案/解决方案。在 ASP.NET 中,单个请求可以(并且通常会在负载很重的情况下)在线程之间跳转。执行此操作时,不会保留 CallContext,只会迁移 HttpContext。如果您希望它在 ASP.NET 中可靠地工作(在负载下),您需要将 CallContext 更改为 HttpContext.Current.Items。
标签: asp.net singleton unity-container unit-of-work lifetime