C#以更好的方式使用db上下文和异常处理(DRY)

时间:2016-02-19 07:10:26

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

我正在WEP API控制器的给定操作中编写这段代码,我正在制作Web API控制器中的所有操作方法,导致大量代码冗余并重复我的自我(!DRY)因此我需要一种方法这可以通过使用继承或iterface或使用任何其他面向对象的方法的更好方法来完成。

[Route("myApiGetRequest")]
[HttpGet]
public IHttpActionResult myApiGetRequest(long id)
{
    try
    {
        DataTable transaction = new DataTable();
        using (var context = new myDbContext())
        {
            //code for what I want to do

        }
    }
    catch (Exception ex)
    {
        return Ok(new { success = false, message = ex.Message });
    }
}

2 个答案:

答案 0 :(得分:2)

ExceptionHandling可以通过实现自己的ExceptionFilterAttribute来完成。您可以使用此属性来装饰需要异常处理的所有控制器。

基本上,您覆盖OnException方法并将不同的异常类型转换为状态代码和消息。

答案 1 :(得分:2)

您可以利用WebApi中提供的异常过滤器。然后,将异常处理代码移动到该过滤器。

例如:

public class MyExceptionFilterAttribute : ExceptionFilterAttribute 
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is Exception)
        {
            context.Response = new HttpResponseMessage { Content = new StringContent("Exception occured", System.Text.Encoding.UTF8, "text/plain"), StatusCode = HttpStatusCode.InternalServerError};
        }
    }
}

然后在您的WebApi控制器中,您可以执行以下操作:

[Route("myApiGetRequest")]
[HttpGet]
[MyExceptionFilter]
public IHttpActionResult myApiGetRequest(long id)
{
    DataTable transaction = new DataTable();
    using (var context = new myDbContext())
    {
         //code for what I want to do

    }
}

您的myApiGetRequest中出现的异常将由相应的异常过滤器处理,此过滤器将被装饰