我已经将业务逻辑与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);
}
但是,我很好奇,我在整个项目中实现的这个系统是否实际上是代码味道,是否仅抛出异常会更简单(并且可能更有效)。