Meh*_*ili 6 wcf unit-of-work autofac
如何使用Autofac在WCF服务中实现工作单元模式?
使用Autofac的wcf集成,可以轻松地将每个调用(或Autofac术语LifetimeScope)工作接口单元中的相同实例注入到我的服务和存储库中 - 我所遵循的是在返回WCF服务时提交工作单元更改的方法如果没有任何例外,显然只会打电话.
我已经看到使用自定义端点行为与WCF和Autofac,这基本上是我开始,但不处理异常.
目前我所拥有的是IOperationInvoker在Invoke中启动工作单元并仅在没有任何异常的情况下提交它.这种方法的问题是我需要在方法中解析我的工作单元实例,Invoke这给了我一个不同于注入我的服务和存储库的实例AutofacInstanceProvider.
Bradley Boveinis 找到了解决这个问题的方法。我们还没有彻底测试它,但它似乎有效:
public class UnitOfWorkAwareOperationInvoker : IOperationInvoker
{
private readonly IOperationInvoker _baseInvoker;
public UnitOfWorkAwareOperationInvoker(IOperationInvoker baseInvoker)
{
_baseInvoker = baseInvoker;
}
public object[] AllocateInputs()
{
return _baseInvoker.AllocateInputs();
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
var result = _baseInvoker.Invoke(instance, inputs, out outputs);
var context = OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>();
try
{
context.Resolve<IUnitOfWork>().Save();
}
catch (Exception ex)
{
var message = Message.CreateMessage(MessageVersion.Default, string.Empty);
new ElmahErrorHandler().ProvideFault(ex, null, ref message);
throw;
}
return result;
}
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
return _baseInvoker.InvokeBegin(instance, inputs, callback, state);
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
return _baseInvoker.InvokeEnd(instance, out outputs, result);
}
public bool IsSynchronous
{
get { return _baseInvoker.IsSynchronous; }
}
}
Run Code Online (Sandbox Code Playgroud)
关键在下面一行:
OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>();
Run Code Online (Sandbox Code Playgroud)
这会将 UoW 从环境/当前/上下文 LifetimeScope 中获取。
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |