想要重构想法

时间:2015-01-13 20:56:39

标签: c# generics asp.net-web-api

我有几个WebApi控制器使用2个泛型类进行处理。根据请求中发送的数据,调用其中一个泛型类。此逻辑包含在Try / Catch中,用于处理超时,身份验证失败和系统错误。当我开始查看GET和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.");
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在基类中编辑类似的方法:

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.");
    }  
}

答案 1 :(得分:1)

您可以创建自定义属性。这样的事情。

[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将处理它。