我正在寻找一种解决方案来改进我的代码。
我在所有控制器中都有此代码:
var data = await _accountService.Create(value);
if (data.HasError)
{
return BadRequest(data);
}
return Ok(data);
我正在寻找一种解决方案,无需检查HasError是否存在。
在我的所有服务中,我返回以下课程:
public class ResponseEnvelope<T>
{
public T Result { get; set; }
public IList<ErrorDto> Errors { get; set; }
public IList<MessageDto> Messages { get; set; }
public bool HasError
{
get
{
return Errors != null && Errors.Any();
}
}
public bool HasMessage
{
get
{
return Messages != null && Messages.Any();
}
}
public ResponseEnvelope<T> AddError(string code, string message = null, string description = null)
{
Errors.Add(new ErrorDto(code, message, description));
return this;
}
}
如果我做对了,您只是在Sercece上调用一个方法并返回其响应换行,然后将扩展方法添加到Controller
:
public IActionResult WrapResponse<T>(this Controller controller, ResponseEnvelope<T> envelope){
return envelope.HasError ? controller.BadRequest(envelope) : controller.Ok(envelope);
}
并将其作为this.WrapResponse(data)
调用
。Net核心
您可以使用ActionFilter或Middleware提取此功能。
动作过滤器具有OnActionExecuted
-可以在此处放置此逻辑。
我希望使用Middleware,您可以在调用next.Invoke()
之后执行此操作
。Net Framework
如果使用的是.Net Framework,则有一些选项,例如IHttpHandler,IHttpModule和ActionFilter。您可以在IHttpHandler vs IHttpModule中了解有关模块和处理程序的信息。