FluentResult.RW
1.0.0-beta.3
dotnet add package FluentResult.RW --version 1.0.0-beta.3
NuGet\Install-Package FluentResult.RW -Version 1.0.0-beta.3
<PackageReference Include="FluentResult.RW" Version="1.0.0-beta.3" />
<PackageVersion Include="FluentResult.RW" Version="1.0.0-beta.3" />
<PackageReference Include="FluentResult.RW" />
paket add FluentResult.RW --version 1.0.0-beta.3
#r "nuget: FluentResult.RW, 1.0.0-beta.3"
#:package FluentResult.RW@1.0.0-beta.3
#addin nuget:?package=FluentResult.RW&version=1.0.0-beta.3&prerelease
#tool nuget:?package=FluentResult.RW&version=1.0.0-beta.3&prerelease
Fluent Result
Фреймворк для декларативного управления потоком выполнения в стиле Railway Oriented Programming (ROP).
Он расширяет классический паттерн Result<T>
мощными инструментами для ветвления, повторов, fallback-путей и финализации цепочек..
Установка
C помощью менеджера пакетов NuGet
Install-Package FluentResult.RW
С помощь командной строки .NET Core
dotnet add package FluentResult.RW
Ключевые возможности
Condition (ветвления): декларативные методы
DoOr
,CastOr
,ThenOr
для выбора пути выполнения.Flow: управление основным потоком (
Then
,OnFailure
,Anyway
).Fallback: многоступенчатый failover через
ThenFallback
,DoFallback
,CastFallback
.Retry: гибкие политики повторов (
FixedRetryPolicy
,ExponentialRetryPolicy
,JitterExponentialRetryPolicy
).Lift: мгновенный подъём значений в
Result
(ToSuccessResult
,ToTaskSuccessResult
).
Быстрый старт
var result = 5.ToSuccessResult()
.Then(value => Result.Success(value * 2))
.OnFailure(error => Console.WriteLine($"Ошибка: {error.Message}"))
.Anyway(() => Console.WriteLine("Цепочка завершена"));
if (result.IsSuccess)
Console.WriteLine($"Результат: {result.Value}");
Condition (ветвления)
Пример DoOr
:
result.DoOr(
condition: value => value > 10,
whenTrue: () => Console.WriteLine("Больше 10"),
whenFalse: () => Console.WriteLine("10 или меньше")
);
Пример CastOr
:
Result<string> stringResult = result.CastOr(
condition: value => value % 2 == 0,
whenTrue: value => Result.Success("Чётное"),
whenFalse: value => Result.Failure(new Error(100, "Нечётное"))
);
Async-версия:
var asyncResult = await result.ToTaskSuccessResult()
.CastOrAsync(
condition: v => v > 0,
whenTrue: v => Task.FromResult(Result.Success("Положительное")),
whenFalse: v => Task.FromResult(Result.Failure(new Error(200, "Отрицательное")))
);
);
Flow
Пример использования Then
и OnFailure
:
var result = "Hello".ToSuccessResult()
.Then(v => Result.Success(v + " World"))
.OnFailure(error => Console.WriteLine($"Ошибка: {error.Message}"))
.Anyway(() => Console.WriteLine("Финализирующий код"));
Fallback
Пример ThenFallback
:
var result = initialResult.ThenFallback(
defaultError: new Error(999, "Все варианты исчерпаны"),
mainPath: value => TryPrimary(value),
fallBackPath: TrySecondary, TryTertiary
);
Retry
Пример DoRetryAsync
:
var result = await initialResult.DoRetryAsync(
retryReason: r => !r.IsSuccess,
retryAction: v => SomeOperationAsync(v),
policy: new FixedRetryPolicy(attempts: 3, delay: TimeSpan.FromMilliseconds(200))
);
Принципы дизайна
- Никаких исключений в бизнес-логике — только значения
- Минимум магии — методы отражают намерение, а не 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. |
-
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.0.0-beta.3 | 88 | 7/27/2025 |
1.0.0-beta.2 | 18 | 7/19/2025 |
1.0.0-alpha.5 | 87 | 7/4/2025 |
1.0.0-alpha.4 | 79 | 6/28/2025 |
1.0.0-alpha.3 | 114 | 6/22/2025 |
1.0.0-alpha.2 | 74 | 6/22/2025 |
1.0.0-alpha.1 | 77 | 6/20/2025 |