FluentResults - .NET/C#을 위한 일반화된 결과 개체 구현

FluentResults는 일반적인 문제를 해결하기 위해 개발된 경량 .NET 라이브러리입니다. 예외를 던지거나 사용하는 대신 작업의 성공 또는 오류를 나타내는 객체를 반환합니다.

주요 기능

  • 모든 컨텍스트에서 동작하는 일반화된 컨테이너(ASP.NET MVC/Web API, WPF, DDD 도메인 모델 등)
  • 하나의 결과 개체에 여러 오류 저장 가능
  • 문자열 형식의 실패 메시지 대신 강력하고 정교한 오류 및 성공 개체를 저장
  • 객체 지향 방식으로 오류/성공 설계
  • 계층적 방식으로 오류 인쇄 및 근본적인 원인 저장 가능
  • 다양한 프레임워크/라이브러리와의 통합을 보여주는 강력한 코드 샘플 제공
  • FluentResult 개체를 우아한 방식으로 어설션 하는 FluentAssertions 확장 기능

왜 예외(exceptions) 대신 결과(results)를 사용해야 할까요?

결과 개체를 반환하는 것은 새로운 것이 아니며 함수형 프로그래밍 언어에서 유래되었습니다. FluentResults를 사용하면 이 패턴을 .NET/C#에서도 사용할 수 있습니다.

블라디미르 코리코프가 작성한 흐름 제어에 대한 예외 문서에서는 결과 패턴이 적합한 시나리오와 그렇지 않은 시나리오에 대해 매우 잘 설명되어 있습니다. 결과 패턴에 대해 자세히 알아보려면 모범 사례 목록리소스 목록을 참조하세요.

반환값이 없는 사용법

public Result DoTask()
{
    if (this.State == TaskState.Done)
        return Result.Fail("Task is in the wrong state.");

    // rest of the logic

    return Result.Ok();
}

반환값이 있는 경우

public Result<Task> GetTask()
{
    if (this.State == TaskState.Deleted)
        return Result.Fail<Task>("Deleted Tasks can not be displayed.");

    // rest of the logic

    return Result.Ok(task);
}

결과에 대한 이유, 오류, 성공 메시지 및 값을 가져오는 방법

Result<int> result = DoSomething();
     
// get all reasons why result object indicates success or failure. 
// contains Error and Success messages
IEnumerable<IReason> reasons = result.Reasons;

// get all Error messages
IEnumerable<IError> errors = result.Errors;

// get all Success messages
IEnumerable<ISuccess> successes = result.Successes;

if (result.IsFailed)
{
    // handle error case
    var value1 = result.Value; // throws exception because result is in failed state
    var value2 = result.ValueOrDefault; // return default value (=0) because result is in failed state
    return;
}

// handle success case
var value3 = result.Value; // return value and doesn't throw exception because result is in success state
var value4 = result.ValueOrDefault; // return value because result is in success state

이외에 Fluent API 방식 및 FailIf(), Try(), Setup(), Merge()등 다양한 기능들을 사용할 수 있습니다.


8개의 좋아요