Class Result<T>
Namespace: Momentum.Extensions
Assembly: Momentum.Extensions.dll
Represents a result that can be either a success value or a list of validation failures.
public class Result<T> : OneOfBase<T, List<ValidationFailure>>, IOneOf
Type Parameters
T
The type of the success value.
Inheritance
object ← OneOfBase<T, List<ValidationFailure>> ← Result<T>
Implements
IOneOf
Inherited Members
OneOfBase<T, List<ValidationFailure>>.Switch(Action<T>, Action<List<ValidationFailure>>), OneOfBase<T, List<ValidationFailure>>.Match<TResult>(Func<T, TResult>, Func<List<ValidationFailure>, TResult>), OneOfBase<T, List<ValidationFailure>>.TryPickT0(out T, out List<ValidationFailure>), OneOfBase<T, List<ValidationFailure>>.TryPickT1(out List<ValidationFailure>, out T), OneOfBase<T, List<ValidationFailure>>.Equals(object), OneOfBase<T, List<ValidationFailure>>.ToString(), OneOfBase<T, List<ValidationFailure>>.GetHashCode(), OneOfBase<T, List<ValidationFailure>>.Value, OneOfBase<T, List<ValidationFailure>>.Index, OneOfBase<T, List<ValidationFailure>>.IsT0, OneOfBase<T, List<ValidationFailure>>.IsT1, OneOfBase<T, List<ValidationFailure>>.AsT0, OneOfBase<T, List<ValidationFailure>>.AsT1, object.GetType(), object.MemberwiseClone(), object.ToString(), object.Equals(object?), object.Equals(object?, object?), object.ReferenceEquals(object?, object?), object.GetHashCode()
Examples
public Result<User> CreateUser(CreateUserCommand command)
{
var validationResult = validator.Validate(command);
if (!validationResult.IsValid)
return validationResult.Errors;
var user = new User(command.Name, command.Email);
return user;
}
Remarks
Result Pattern Implementation
Overview
This class uses the OneOf library to provide a discriminated union pattern, allowing methods to return either a successful result of type T
or a list of validation failures. This is particularly useful for command handlers and other operations that need to communicate validation errors without throwing exceptions.
The Result pattern provides a functional approach to error handling, making it explicit whether an operation succeeded or failed. This eliminates the need for exception-based error handling in business logic scenarios where failures are expected and recoverable.
Key Benefits
- Explicit Error Handling: Forces callers to handle both success and failure cases
- Performance: Avoids the overhead of exceptions for expected validation failures
- Type Safety: Compile-time guarantees about handling both success and error paths
- Functional Programming: Enables functional composition and chaining of operations
- Clean Architecture: Separates business rule violations from unexpected system errors
Common Usage Patterns
Command Handler Implementation
public class CreateUserCommandHandler
{
public Result<User> Handle(CreateUserCommand command)
{
var validationResult = validator.Validate(command);
if (!validationResult.IsValid)
return validationResult.Errors;
var user = new User(command.Name, command.Email);
return user;
}
}
Consuming Results
var result = handler.Handle(command);
result.Match(
user => Console.WriteLine($"Created user: {user.Name}"),
errors => errors.ForEach(e => Console.WriteLine($"Error: {e.ErrorMessage}"))
);
API Controller Integration
[HttpPost]
public ActionResult<UserDto> CreateUser(CreateUserRequest request)
{
var result = userService.CreateUser(request);
return result.Match<ActionResult<UserDto>>(
user => Ok(mapper.Map<UserDto>(user)),
errors => BadRequest(errors.Select(e => e.ErrorMessage))
);
}
Constructors
Result(OneOf<T, List<ValidationFailure>>)
public Result(OneOf<T, List<ValidationFailure>> _)
Parameters
_
OneOf<T, List<ValidationFailure>>
Operators
explicit operator T(Result<T>)
public static explicit operator T(Result<T> _)
Parameters
_
Result<T>
Returns
T
explicit operator List<ValidationFailure>(Result<T>)
public static explicit operator List<ValidationFailure>(Result<T> _)
Parameters
_
Result<T>
Returns
List<ValidationFailure>
implicit operator Result<T>(T)
public static implicit operator Result<T>(T _)
Parameters
_
T
Returns
Result<T>
implicit operator Result<T>(List<ValidationFailure>)
public static implicit operator Result<T>(List<ValidationFailure> _)
Parameters
_
List<ValidationFailure>
Returns
Result<T>