C# 转换ASP.NET核心操作结果<;T>;对象转换为筛选器中的其他类型
我有一个通用的C# 转换ASP.NET核心操作结果<;T>;对象转换为筛选器中的其他类型,c#,asp.net-core,filter,action-filter,C#,Asp.net Core,Filter,Action Filter,我有一个通用的Result类型,我从业务级别的服务中使用它来返回结果。此类型包括具有实际值(public T value{get;})的属性,以及指示成功、未找到、验证错误或其他选项的状态属性 在API控制器中,我可以评估服务调用的结果并返回适当的操作结果,如NotFound或Ok或BadRequest 我可以在方法中手动执行我想要的操作 public ActionResult<Result<Customer>> GetCustomer(int id) { Res
Result
类型,我从业务级别的服务中使用它来返回结果。此类型包括具有实际值(public T value{get;}
)的属性,以及指示成功、未找到、验证错误或其他选项的状态属性
在API控制器中,我可以评估服务调用的结果并返回适当的操作结果,如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);
}
在我的TranslateResultToHttpAttribute
中,我需要获取结果,查看它的值,如果它真的可以,我将用客户
替换结果
。但如果是NotFound,我会返回NotFound,等等
问题是过滤器不知道
结果可能是什么,所以我很难将结果解包以获取其值,等等。假设您的结果
类型有一个包含纯状态的非泛型基接口,您可以直接返回结果,得到一个隐式对象结果。然后,您可以实现一个结果过滤器来更新状态代码:
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
)相同,因为它们只是带有预定义的状态代码。假设您的Result
类型具有包含纯状态的非泛型基本接口,您可以直接返回结果,获取隐式对象结果。然后,您可以实现一个结果过滤器来更新状态代码:
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;
}
}
}
最后,这与返回的具体结果一样,比如“代码> NoDebug结果< /COD>或BuildRebug结果< /代码>,因为这些只是预先定义的状态代码。
HMM,您考虑了自定义动作结果类型而不是过滤器吗?不,这有帮助吗?我仍然需要以某种方式将该操作结果类型转换为另一种类型(NotFoundResult、OkResults等)。尽管定制用户可能会根据需要使用这些结果所使用的服务来编写结果。。只是在这里大声思考一下,不确定这是否真的有效:\或者是将结果转换为IActionResult的扩展方法?:)您可以将结果类型设置为IActionResult
,并直接使用它。或者返回一个<代码> ObjutRebug < /Cord>,然后可以在结果筛选器中更新结果。HMM,您考虑了自定义操作结果类型而不是过滤器吗?不,会有帮助吗?我仍然需要以某种方式将该操作结果类型转换为另一种类型(NotFoundResult、OkResults等)。尽管定制用户可能会根据需要使用这些结果所使用的服务来编写结果。。只是在这里大声思考一下,不确定这是否真的有效:\或者是将结果转换为IActionResult的扩展方法?:)您可以将结果类型设置为IActionResult
,并直接使用它。或者返回一个ObjectResult
,然后可以在结果过滤器中更新结果。