gpt4 book ai didi

wcf - 使用 Autofac 在 WCF 服务中实现工作单元

转载 作者:行者123 更新时间:2023-12-04 16:00:32 27 4
gpt4 key购买 nike

如何使用 Autofac 在 WCF 服务中实现工作单元模式?

使用 Autofac 的 wcf 集成可以轻松地将工作单元接口(interface)的每次调用(或 Autofac 术语 LifetimeScope)注入(inject)到我的服务和存储库中 - 我所追求的是一种在 WCF 服务返回时提交工作单元更改的方法显然只有在没有任何异常的情况下才调用。

我看过Using a Custom Endpoint Behavior with WCF and Autofac这基本上是我开始的方式,但不处理异常。

目前我拥有的是 IOperationInvoker启动 Invoke 中的工作单元并仅在没有任何异常时提交它。这种方法的问题是我需要在 Invoke 中解析我的工作单元实例。该方法为我提供了一个与使用 AutofacInstanceProvider 注入(inject)我的服务和存储库的实例不同的实例.

最佳答案

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; }
}
}

关键在以下行:
OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>();

这会将 UoW 从环境/当前/上下文 LifetimeScope 中提取出来。

关于wcf - 使用 Autofac 在 WCF 服务中实现工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com