Как лучше всего обращаться с событиями NotFound и BadRequest в бизнес-логике? - PullRequest
0 голосов
/ 08 октября 2019

Я отделил бизнес-логику от контроллеров WebAPI, потому что намереваюсь добавить методы бизнес-логики в общую библиотеку для других проектов.

Поэтому я создал класс с именем ProcessResponse для работы с ним. сценарии, которые обычно приводят к возникновению исключения, такого как BadRequest и NotFound ошибки.

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

Мне любопытно, есть ли у меня эта система? реализованный в проекте на самом деле запах кода и будет ли проще (и потенциально более эффективным) просто вызвать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...