.net FluentResults在获取或序列化Value时引发InvalidOprationException异常

jaql4c8m  于 2023-01-18  发布在  .NET
关注(0)|答案(2)|浏览(184)

注意:请在此处使用声誉较高的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我该如何修复这个代码?

eagi6jfj

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有关详细信息,请阅读自述文件。

klh5stk1

klh5stk12#

你可以使用装饰器模式

public class SafeResult<T> : IResult<T>
{
    private readonly IResult<T> _origin;

    public SafeResult(IResult<T> origin)
    {
        _origin = origin;
    }

    public T Value => _origin.ValueOrDefault;

    public bool IsFailed => _origin.IsFailed;

    public bool IsSuccess => _origin.IsSuccess;

    public List<IReason> Reasons => _origin.Reasons;

    public List<IError> Errors => _origin.Errors;

    public List<ISuccess> Successes => _origin.Successes;

    public T ValueOrDefault => _origin.ValueOrDefault;
}

注意,在上面的代码片段中使用了Value => _origin.ValueOrDefault

var failure = Result.Fail<Model>("Invalid Model");
return new SafeResult<Model>(failure);

相关问题