几天前,我遇到了ASP.Net线程的这个问题.我希望每个Web请求都有一个单例对象.我的工作单位实际上需要这个.我想为每个Web请求实例化一个工作单元,以便身份映射在整个请求中有效.这样我就可以使用IoC透明地将我自己的IUnitOfWork注入到我的存储库类中,并且我可以使用相同的实例来查询然后更新我的实体.
由于我使用Unity,我错误地使用了PerThreadLifeTimeManager.我很快意识到ASP.Net线程模型不支持我想要实现的目标.基本上它使用theadpool并回收线程,这意味着每个线程我得到一个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()
{
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我使用它来使用与此类似的代码注册我的工作单元:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
Run Code Online (Sandbox Code Playgroud)
希望能节省一些时间.
如何使用Autofac在WCF服务中实现工作单元模式?
使用Autofac的wcf集成,可以轻松地将每个调用(或Autofac术语LifetimeScope)工作接口单元中的相同实例注入到我的服务和存储库中 - 我所遵循的是在返回WCF服务时提交工作单元更改的方法如果没有任何例外,显然只会打电话.
我已经看到使用自定义端点行为与WCF和Autofac,这基本上是我开始,但不处理异常.
目前我所拥有的是IOperationInvoker在Invoke中启动工作单元并仅在没有任何异常的情况下提交它.这种方法的问题是我需要在方法中解析我的工作单元实例,Invoke这给了我一个不同于注入我的服务和存储库的实例AutofacInstanceProvider.