gpt4 book ai didi

wcf - 使用 WCF 和 Autofac 的自定义端点行为

转载 作者:行者123 更新时间:2023-12-04 14:35:33 25 4
gpt4 key购买 nike

我正在尝试实现如下所示的 UoW:
https://blog.iannelson.uk/wcf-global-exception-handling/

但我终其一生都无法弄清楚如何将其与 Autofac 连接起来。我完全不知道从哪里开始。

我通过使用 http://autofac.readthedocs.org/en/latest/integration/wcf.html 使 WCF 与 Autofac 一起正常工作

但是要注入(inject)或添加 IEndpointBehavior?不知道...

如果有更好的方法来实现 UoW,我想听听。

编辑:

现在我刚刚完成:

builder.RegisterType(typeof (UnitOfWork))
.As(typeof (IUnitOfWork))
.InstancePerLifetimeScope()
.OnRelease(x =>
{
Trace.WriteLine("Comitted of UoW");
((IUnitOfWork) x).Commit();
// OnRelease inhibits the default Autofac Auto-Dispose behavior so explicitly chain to it
x.Dispose();
});

虽然我不知道这是否是一种可接受的方式,但似乎是一种 hack :(

编辑2:

似乎不可能在 WCF 中运行 UoW:/

编辑 3:

我在这里发布了我的解决方案: http://www.philliphaydon.com/2011/11/06/unit-of-work-with-wcf-and-autofac/

最佳答案

我找到了解决这个问题的方法,只有在没有抛出错误的情况下才会提交工作单元。

在 Autofac 中将工作单元注册为 InstancePerLifetimeScope

    builder.RegisterType(typeof (UnitOfWork))
.As(typeof (IUnitOfWork)).InstancePerLifetimeScope();

然后我创建了一个组合的 EndpointBehavior 和一个 ErrorHandler。
public class UnitOfWorkEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void Validate(ServiceEndpoint endpoint)
{
}

public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}

public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
var unitOfWorkInstanceHandler = new UnitOfWorkInstanceHandler();

endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(unitOfWorkInstanceHandler);
endpointDispatcher.DispatchRuntime.InstanceContextInitializers.Add(unitOfWorkInstanceHandler);
}

public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}

protected override object CreateBehavior()
{
return new UnitOfWorkEndpointBehavior();
}

public override Type BehaviorType
{
get { return typeof (UnitOfWorkEndpointBehavior); }
}
}



public class UnitOfWorkInstanceHandler : IInstanceContextInitializer, IErrorHandler
{
private bool _doCommit = true;

public void Initialize(InstanceContext instanceContext, Message message)
{
instanceContext.Closing += CommitUnitOfWork;
}

void CommitUnitOfWork(object sender, EventArgs e)
{
//Only commit if no error has occured
if (_doCommit)
{
//Resolve the UnitOfWork form scope in Autofac
OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>().Resolve<IUnitOfWork>().Commit();
}
}

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
_doCommit = false;
}

public bool HandleError(Exception error)
{
_doCommit = false;
return false;
}
}

在 web.config 中注册 Endpoint Behavior
<system.serviceModel>
...
<extensions>
<behaviorExtensions>
<add name="UnitOfWork" type="Namespace.UnitOfWorkBehavior, Namespace"/>
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="">
<UnitOfWork/>
</behavior>
</endpointBehaviors>
...
</behaviors>
...
</system.serviceModel>

关于wcf - 使用 WCF 和 Autofac 的自定义端点行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7989918/

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