将ASP.NET Core ActionResult 对象转换为过滤器中的另一种类型

问题描述 投票:1回答:1

我有一个通用的Result<T>类型,我正在从业务级服务中使用它来返回结果。此类型包括具有实际值(public T Value {get;})的属性以及指示成功,未找到,验证错误或其他选项的状态属性。

[在API控制器中,我可以评估服务调用的结果并返回适当的ActionResult,例如NotFoundOkBadRequest

我可以在方法中手动执行所需的操作

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

Example based on source here

但是我想改用过滤器

我希望能够从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,所以我很难解压结果以获取其值,等等。

c# asp.net-core filter action-filter
1个回答
0
投票
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; } } }

最后,这与返回诸如NotFoundResultBadRequestResult之类的特定结果相同,因为这些只是具有预定状态代码的StatusCodeResults

© www.soinside.com 2019 - 2024. All rights reserved.