Я отделил бизнес-логику от контроллеров 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;
}
}
Причина, по которой я это реализовал, заключается в том, что
- Этопозволяет мне не генерировать исключение
- Я могу предоставить настраиваемое сообщение об ошибке контроллеру
Любые процессы, которые могут генерировать исключения, имеют 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);
}
Мне любопытно, есть ли у меня эта система? реализованный в проекте на самом деле запах кода и будет ли проще (и потенциально более эффективным) просто вызвать исключение.