注意:请在此处使用声誉较高的FluentResults标签。
我使用的是.Net 6,FluentResults 3.5.0有问题。假设我有以下类:
public class Person
{
public FluentResults.Result<List<Person>> GetAll()
{
return FluentResults.Result.Fail("SomeError1");
}
}
以及以下API方法:
[HttpGet("Normal")]
public async Task<ActionResult<object>>? Normal()
{
var r1 = FluentResults.Result.Fail("SomeError2");
return BadRequest(r1);
}
[HttpGet("Buggy")]
public async Task<ActionResult<object>>? Buggy()
{
Person p = new();
return BadRequest(p.GetAll());
}
第一个是按预期正常工作。错误代码为400,结果如下:
但是我想使用的第二个命令返回内部服务器错误(500):
我认为问题出在Result.Value抛出InvalidOperationException,所以它不能被序列化。2我该如何修复这个代码?
2条答案
按热度按时间eagi6jfj1#
我是FluentResults的维护者。
不建议序列化FluentResults中的结果对象。为什么?请参阅https://github.com/altmann/FluentResults#serializing-result-objects-aspnet-webapi-hangfire
第一个方案运行良好,因为您返回了Result对象。Result对象没有Value属性。在第二个方案中,您返回了具有Value属性的Result对象。如果返回了失败的Result对象并调用了result.Value,则会得到您所看到的异常。如果你真的想在你的公共API中使用FluentResults的Result对象,那么也许你可以设置你的序列化库来忽略Value属性。可以安全调用属性ValueOrDefault,因为如果结果处于失败状态,它将返回默认值。https://github.com/altmann/FluentResults#processing-a-result有关详细信息,请阅读自述文件。
klh5stk12#
你可以使用装饰器模式
注意,在上面的代码片段中使用了
Value => _origin.ValueOrDefault