gpt4 book ai didi

wcf - 使用 WCF WebApi 实现工作单元

转载 作者:行者123 更新时间:2023-12-04 13:48:32 25 4
gpt4 key购买 nike

我在使用新的 WCF WebApi 时面临的挑战之一是我无法干净地实现 UnitOfWork 模式。

作为快速背景,该模式的工作原理是在请求开始时启动一个工作单元,做一些工作,然后回滚或提交该工作单元。

使用 HttpMessageHandler 功能设置“启动”工作单元的代码非常容易。通过 Task<> 库,我可以编写一个在处理请求后执行的延续。但是,我不能总是确定是否发生了故障以便回滚。

WCF 对故障具有低级支持,在传统的 WCF 服务端点中,您可以检查 channel 是否发生故障(例如,从 IMessageInspector 内部)。但 WebApi 似乎阻止了这种行为。

WebApi 确实公开了一个 HttpErrorHandler 契约。但是,这是非常有限的,因为您无权访问实例上下文或服务实例,因此我无权访问我的工作单元。

我想知道这里使用了哪些其他方法来实现工作单元模式?

最佳答案

Pedro 和 Darrel 都提出了很好的建议。在我最终想出的解决方案中,我最终使用了消息处理程序:

public class UnitOfWorkHandler : DelegatingHandler 
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var unitOfWork = new UnitOfWork();
unitOfWork.Begin();
return base.SendAsync(request, cancellationToken).ContinueWith(result =>
{
if (result.Result is HttpResponseMessage && ((HttpResponseMessage)result.Result).IsSuccessStatusCode)
{
unitOfWork.Commit();
}
else
{
unitOfWork.Rollback();
}
return result.Result;
});
}
}

我会使用 Darrel 的 suggestion在 HttpRequestMessage 属性集合上存储对 UnitOfWork 的引用,但是由于任务延续是作为闭包实现的,因此我可以简单地引用我在其外部范围内创建的工作单元。

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

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