我有几个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.");
}
}
答案 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将处理它。