在业务逻辑中处理NotFound和BadRequest事件的最佳方法是什么?

时间:2019-10-08 14:24:06

标签: c# exception

我已经将业务逻辑与WebAPI控制器分离了,因为我打算将业务逻辑方法添加到其他项目的共享库中。

因此,我创建了一个名为ProcessResponse的类来处理通常会导致引发异常的情况,例如BadRequestNotFound错误。

public enum ResponseType
{
    Ok,
    NotFound,
    BadRequest
}

public class ProcessResponse<T>
{
    public ResponseType ResponseType { get; set; }
    public string ResponseMessage { get; set; }
    public T ResponseObject { get; set; }

    public ProcessResponse(ResponseType responseType, string responseMessage, T responseObject)
    {
        ResponseType = responseType;
        ResponseMessage = responseMessage;
        ResponseObject = responseObject;
    }
}

我之所以这么做是因为

  1. 它使我避免引发异常
  2. 我可以向控制器提供自定义错误消息

任何可能引发异常的进程都将ProcessResponse作为返回类型:

 public static ProcessResponse<DocumentDto> GetDocumentById(int documentId, MyPortalDbContext context)
    {
        var document = context.Documents
            .Single(x => x.Id == documentId);

        if (document == null)
        {
            return new ProcessResponse<DocumentDto>(ResponseType.NotFound, "Document not found", null);
        }

        return new ProcessResponse<DocumentDto>(ResponseType.Ok, null, Mapper.Map<Document, DocumentDto>(document));
    }

然后ProcessResponse对象由控制器处理:

//If ProcessResponse does NOT return an object
    protected IHttpActionResult PrepareResponse(ProcessResponse<object> response)
    {
        if (response.ResponseType == ResponseType.NotFound)
        {
            return Content(HttpStatusCode.NotFound, response.ResponseMessage);
        }

        if (response.ResponseType == ResponseType.Ok)
        {
            return Ok(response.ResponseMessage);
        }

        return Content(HttpStatusCode.BadRequest, response.ResponseMessage);
    }

    //If ProcessResponse returns an object
    protected T PrepareResponseObject<T>(ProcessResponse<T> response)
    {
        if (response.ResponseType == ResponseType.NotFound)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }

        if (response.ResponseType == ResponseType.Ok)
        {
            return response.ResponseObject;
        }

        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

但是,我很好奇,我在整个项目中实现的这个系统是否实际上是代码味道,是否仅抛出异常会更简单(并且可能更有效)。

0 个答案:

没有答案
相关问题