我有一个通用的Result<T>
类型,我正在从业务级服务中使用它来返回结果。此类型包括具有实际值(public T Value {get;}
)的属性以及指示成功,未找到,验证错误或其他选项的状态属性。
[在API控制器中,我可以评估服务调用的结果并返回适当的ActionResult,例如NotFound
或Ok
或BadRequest
。
我可以在方法中手动执行所需的操作
public ActionResult<Result<Customer>> GetCustomer(int id)
{
Result<Customer> result = _someService.GetGetCustomer(id);
if (result.Status == ResultStatus.NotFound) return NotFound();
if (result.Status == ResultStatus.Invalid)
{
foreach (var error in result.ValidationErrors)
{
ModelState.AddModelError(error.Key, error.Value);
}
return BadRequest(ModelState);
}
return Ok(result.Value);
}
但是我想改用过滤器
我希望能够从ActionFilter内执行此操作,但是我想出如何转换值的方法并没有取得太大的成功,因为我希望过滤器可用于任何类型的T
。一些伪代码可能会有所帮助:
[TranslateResultToHttp]
public ActionResult<Result<Customer>> GetCustomer(int id)
{
Result<Customer> result = _someService.GetCustomer(int id);
return Ok(result);
}
在我的TranslateResultToHttpAttribute
中,我需要获取结果结果,看一下它的值,如果确实可以,我将只用Result<Customer>
替换Customer
。但是,如果是NotFound,我会返回NotFound等。
问题是过滤器不知道Result<T>
可能是多少T,所以我很难解压结果以获取其值,等等。
public interface IResult
{
int Result { get; set; } // could of course be something else
}
public class UpdateResultFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{ }
public void OnResultExecuted(ResultExecutedContext context)
{
if (context.Result is ObjectResult objectResult && objectResult.Value is IResult result)
{
// update status on object result
objectResult.StatusCode = result.Status;
}
}
}
最后,这与返回诸如NotFoundResult
或BadRequestResult
之类的特定结果相同,因为这些只是具有预定状态代码的StatusCodeResult
s。