FluentResult.RW
1.0.0-beta.2
This is a prerelease version of FluentResult.RW.
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package FluentResult.RW --version 1.0.0-beta.2
NuGet\Install-Package FluentResult.RW -Version 1.0.0-beta.2
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="FluentResult.RW" Version="1.0.0-beta.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FluentResult.RW" Version="1.0.0-beta.2" />
<PackageReference Include="FluentResult.RW" />
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 FluentResult.RW --version 1.0.0-beta.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: FluentResult.RW, 1.0.0-beta.2"
#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 FluentResult.RW@1.0.0-beta.2
#: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=FluentResult.RW&version=1.0.0-beta.2&prerelease
#tool nuget:?package=FluentResult.RW&version=1.0.0-beta.2&prerelease
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Fluent Result
Библиотека для безопасного и выразительного управления результатами операций в .NET, вдохновлённый RailWay-подходом и концепцией "ошибка как значение".
Установка FluentResult
C помощью менеджера пакетов NuGet
Install-Package FluentResult.RW
С помощь командной строки .NET Core
dotnet add package FluentResult.RW
Базовая идея
Result<int> result = Parse(input)
.Then(val => Validate(val))
.Then(val => SaveToDatabase(val))
.Do(val => LogSuccess(val))
.OnFailure(error => LogError(error))
.Anyway(() => Metrics.Send());
return result;
Основные типы
| Класс | Семантика |
|---|---|
Result |
Представляет успешный или неуспешный результат без значения. |
Result<T> |
Представляет результат с возвращаемым значением. |
Error |
Представляет ошибку. Может быть создан из строки, исключения или как отдельный тип |
Основные методы
| Метод | Что делает | Сигнатура | Семантика |
|---|---|---|---|
Then |
Преобразует успешное значение T в новое значение T |
Result<T> → ./Result<T> |
Основная трансформация |
Do |
Выполняет побочный эффект на успешном результате (T) |
Result<T> → Result<T> |
Логгирование, аудиты и т.д. |
Anyway |
Выполняется всегда, независимо от успеха или ошибки | Result<T> → Result<T> |
Аналог finally, полезен для метрик |
Cast |
Преобразует T в U, меняя тип контейнера |
Result<T> → Result<U> |
Преобразование типа |
OnFailure |
Обрабатывает ошибку без изменения значения | Result<T> → Result<T> |
Логгирование ошибок |
Методы ветвления
| Метод | Что делает | Сигнатура | Семантика |
|---|---|---|---|
ThenOr |
Преобразует успешное значение T в новое значение T при выполнении условия |
Result<T> → Result<T> whenTrue Or Result<T> whenFalse |
Основная трансформация |
DoOr |
Выполняет побочный эффект на успешном результате (T) |
Result<T> → Result<T> whenTrue Or Result<T> whenFalse |
Логгирование, аудиты и т.д. |
CastOr |
Преобразует T в U, меняя тип контейнера |
Result<T> → Result<U> whenTrue Or Result<U> whenFalse |
Преобразование типа |
Методы повторных попыток (Retry)
| Метод | Что делает | Сигнатура | Семантика |
|---|---|---|---|
FirstSuccess |
Выполняет операции до первого успешного результата | Result<T> → Result<T> |
Пробует операции по порядку до первого успеха |
Примеры использования
Успешная цепочка
Result<string> result = GetUser(id)
.Then(user => ValidateUser(user))
.Then(user => SendWelcomeEmail(user));
Ошибка коротит цепочку
Result<string> result = GetUser(id)
.Then(user => ValidateUser(user)) // Fail → дальше не пойдёт
.Then(user => SendWelcomeEmail(user)); // не будет вызван
Обработка побочных эффектов
Result result = Process()
.Do(result => LogSuccess(result))
.OnFailure(error => LogFailure(error))
.Anyway(() => Metrics.Record());
Изменение типа результата
Result<string> result = GetUser()
.Cast(user => GetUserEmail(user));
Использование FirstSuccess
Result<string> result = GetUser(id)
.FirstSuccess(
Error.NotFound(404, "All fallbacks failed"),
user => TryCache(user),
user => TryDatabase(user),
user => TryLegacySystem(user)
);
Принципы дизайна
- Никаких исключений в бизнес-логике — только значения
- Минимум магии — методы отражают намерение, а не FP-термины
- Явные типы — все ошибки описаны, нет
null,bool,TryXYZ
️ Интеграция в архитектуру
Рекомендовано использовать Result<T>:
- В слое UseCase/Application, где обрабатывается бизнес-логика
- В портах и адаптерах — как входной/выходной контракт
- В домене — только при необходимости делегировать ошибки наружу
Связанные ресурсы
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.2 | 109 | 4/16/2026 |
| 1.0.2 | 96 | 4/12/2026 |
| 1.0.1 | 137 | 1/13/2026 |
| 1.0.0 | 206 | 12/25/2025 |
| 1.0.0-beta.3 | 179 | 7/27/2025 |
| 1.0.0-beta.2 | 81 | 7/19/2025 |
| 1.0.0-alpha.5 | 132 | 7/4/2025 |
| 1.0.0-alpha.4 | 125 | 6/28/2025 |
| 1.0.0-alpha.3 | 155 | 6/22/2025 |
| 1.0.0-alpha.2 | 124 | 6/22/2025 |
| 1.0.0-alpha.1 | 120 | 6/20/2025 |