Core.Result 1.1.0

dotnet add package Core.Result --version 1.1.0
                    
NuGet\Install-Package Core.Result -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Core.Result" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Core.Result" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Core.Result" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Core.Result --version 1.1.0
                    
#r "nuget: Core.Result, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Core.Result@1.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Core.Result&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Core.Result&version=1.1.0
                    
Install as a Cake Tool

Core.Result

A lightweight .NET library that implements the Result pattern with a fluent builder API. Return explicit success or failure outcomes from your domain services instead of relying on exceptions for expected error paths.

Features

  • Generic Result<T, TSuccessStatus, TFailureStatus> with Success and Failure variants
  • Domain-defined status enums — each bounded context defines its own business vocabulary
  • Fluent builder API for configuring results with data, messages, and errors
  • Unit type for operations that succeed without a meaningful payload
  • Zero third-party dependencies

Installation

dotnet add package Core.Result

Or via Package Manager:

Install-Package Core.Result

Domain Layer Setup

Define success and failure status enums in your domain project using business language:

public enum OrderSuccessStatus { Placed, Cancelled, Shipped }

public enum OrderFailureStatus
{
    NotFound,
    AlreadyShipped,
    InvalidQuantity,
    InsufficientStock
}

Map domain statuses to HTTP, events, or UI in the application layer — not inside domain logic.

Quick Start

Success with data

using Core.Result;

var result = Result<Order, OrderSuccessStatus, OrderFailureStatus>
    .InitSuccess(OrderSuccessStatus.Placed)
    .WithData(order)
    .WithMessage("Order placed successfully")
    .Build();

if (result is Success<Order, OrderSuccessStatus, OrderFailureStatus> success)
{
    Console.WriteLine(success.Status);   // OrderSuccessStatus.Placed
    Console.WriteLine(success.Data!.Id);
    Console.WriteLine(success.Message);
}

Success without data

Use Unit when an operation succeeds but has no return value:

var result = Result<Unit, OrderSuccessStatus, OrderFailureStatus>
    .InitSuccess(OrderSuccessStatus.Cancelled)
    .WithMessage("Order cancelled")
    .Build();

Failure with errors

var result = Result<Order, OrderSuccessStatus, OrderFailureStatus>
    .InitFailure(OrderFailureStatus.InvalidQuantity)
    .WithMessage("Order validation failed")
    .AppendErrors(["Quantity must be greater than zero"])
    .Build();

if (result is Failure<Order, OrderSuccessStatus, OrderFailureStatus> failure)
{
    Console.WriteLine(failure.Status);   // OrderFailureStatus.InvalidQuantity
    Console.WriteLine(failure.Message);
    foreach (var error in failure.Errors)
    {
        Console.WriteLine(error);
    }
}

API Overview

Result<T, TSuccessStatus, TFailureStatus>

The base type for all operation outcomes. Both status type parameters must be enums.

Member Description
Message Optional message describing the outcome
InitSuccess(TSuccessStatus status) Starts building a success result with the required status
InitFailure(TFailureStatus status) Starts building a failure result with the required status

Success<T, TSuccessStatus, TFailureStatus>

Represents a successful operation.

Member Description
Status The domain-defined success status
Data The success payload
Init(TSuccessStatus status) Alternative entry point for the success builder

Failure<T, TSuccessStatus, TFailureStatus>

Represents a failed operation.

Member Description
Status The domain-defined failure status
Errors List of error messages
AppendError(errors) Appends errors to the failure
Init(TFailureStatus status) Alternative entry point for the failure builder

Builder methods

Success builder (IConfigureSuccessResultBuilder<T, TSuccessStatus, TFailureStatus>):

Method Description
WithData(T? data) Sets the success payload
WithMessage(string? message) Sets an optional message
Build() Returns the configured Success<T, TSuccessStatus, TFailureStatus>

Failure builder (IConfigureFailureResultBuilder<T, TSuccessStatus, TFailureStatus>):

Method Description
WithMessage(string message) Sets the failure message
AppendErrors(List<string> errors) Adds one or more error messages
Build() Returns the configured Failure<T, TSuccessStatus, TFailureStatus>

Unit

A singleton value type for void-like success results. All Unit instances are equal.

var unit = Unit.Value;
var completed = await Unit.Task; // pre-completed Task<Unit>

Usage in Domain Services

public Success<Order, OrderSuccessStatus, OrderFailureStatus> PlaceOrder(PlaceOrderCommand cmd)
{
    if (cmd.Quantity <= 0)
    {
        return Result<Order, OrderSuccessStatus, OrderFailureStatus>
            .InitFailure(OrderFailureStatus.InvalidQuantity)
            .WithMessage("Validation failed")
            .AppendErrors(["Quantity must be greater than zero"])
            .Build();
    }

    var order = Order.Place(cmd);

    return Result<Order, OrderSuccessStatus, OrderFailureStatus>
        .InitSuccess(OrderSuccessStatus.Placed)
        .WithData(order)
        .WithMessage("Order placed")
        .Build();
}

Mapping at the Application Layer

if (result is Failure<Order, OrderSuccessStatus, OrderFailureStatus> failure)
    return failure.Status switch
    {
        OrderFailureStatus.NotFound => Results.NotFound(failure.Message),
        OrderFailureStatus.InvalidQuantity => Results.BadRequest(failure.Errors),
        OrderFailureStatus.InsufficientStock => Results.UnprocessableEntity(failure.Message),
        _ => Results.BadRequest(failure.Message)
    };

Domain Usage Checklist

  1. Define XxxSuccessStatus and XxxFailureStatus enums in the domain project
  2. Return Success<T, XxxSuccessStatus, XxxFailureStatus> or Failure<...> from domain services
  3. Use InitSuccess(status) / InitFailure(status) — status is always explicit
  4. Use Message and Errors for human-readable detail; use Status for programmatic branching
  5. Map domain status to HTTP, problem details, or integration events in application handlers

Requirements

  • .NET 10.0

Publishing

For maintainers releasing a new version to GitHub and NuGet, see PUBLISHING.md.

Quick reference:

# 1. Test
dotnet test Core.Result.Test\Core.Result.Test.csproj -c Release

# 2. Bump <Version> in Core.Result.csproj, then pack
dotnet pack Core.Result.csproj -c Release

# 3. Push to GitHub
git push origin main

# 4. Push to NuGet
dotnet nuget push "bin\Release\Core.Result.1.1.0.nupkg" `
  --api-key YOUR_NUGET_API_KEY `
  --source https://api.nuget.org/v3/index.json

License

MIT

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Core.Result:

Package Downloads
Application.Abstraction

CQRS abstractions for .NET application layers using SimpleMediator and Core.Result.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.0 59 6/6/2026
1.0.0 47 6/5/2026