需要重构的想法

Refactoring ideas wanted

我有几个 WebApi 控制器使用 2 个通用 类 进行处理。根据请求中发送的数据,调用通用 类 之一。此逻辑包装在 Try/Catch 中,用于处理超时、身份验证失败和系统错误。当我开始查看 GET 和 POST 操作时,它基本上是相同的代码。我试图看看如何重构它,这样就没有重复的代码。 Post 大部分是相同的,除了提供了请求列表。这是重构的尖叫,所以我没有在 5 个不同的控制器中使用它,每个控制器都有不同的工作流通用。关于重构的任何建议?我想尝试将异常逻辑封装到每个控制器都会使用的公共位置。我不想将它添加到工作流中,因为我不想将工作流耦合到作为 Web 请求的调用方法。

这是代码的示例。

private IRequestWorkFlow<RequestTypeA, MyResponse> _WorkFlowA;
private IRequestWorkFlow<RequestTypeB, MyResponse> _WorkFlowB;

public HttpResponseMessage Get([FromUri] RequestTypeA aRequest, [FromUri] RequestTypeB bRequest)
{
    try
    {
        if (!aRequest.IsEmpty())
        {
           var requests = new List<RequestTypeA> { aRequest };
           var aResponses = _WorkFlowA.ProcessRequest(requests);
           return Request.CreateResponse(HttpStatusCode.Ok, aResponses);
        }

        var bRequests = new List<RequestTypeA> { bRequest };
        var bResponses = _WorkFlowB.ProcessRequest(bRequests);
        return Request.CreateResponse(HttpStatusCode.Ok, bResponses);
    }
    catch (TimeoutException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.RequestTimeout, ex.Message);
    }
    catch (UnauthorizedAccessException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.Forbidden, ex.Message);
    }
    catch (Exception)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
    }
}

您可以像在您的基础中那样编辑方法 class:

HttpResponseMessage Try(Func<HttpResponseMessage> method)
{
    try
    {
        return method.Invoke();
    }
    catch (TimeoutException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.RequestTimeout, ex.Message);
    }
    catch (UnauthorizedAccessException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.Forbidden, ex.Message);
    }
    catch (Exception)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
    }  
}

您可以创建自定义属性。像这样。

[OnException]
public class HomeController { .... }   

public class OnException: ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is TimeoutException)
            return Request.CreateErrorResponse(HttpStatusCode.RequestTimeout, ex.Message);
        if (context.Exception is UnauthorizedAccessException )
            return Request.CreateErrorResponse(HttpStatusCode.Forbidden, ex.Message);
        if (context.Exception is Exception)    
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request.");
    }
}

您可以删除 try/catch OnException 将处理它。