需要重构的想法
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 将处理它。
我有几个 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 将处理它。