🚀 背景:当重复模式催生新工具 作为开发者,我们总会遇到某些代码模式反复出现。最终要么决定"该为这个写个工具包了",要么被迫在每个项目里复制粘贴相同代码。我选择了第一条路 😊
在.NET生态中,Result和Result
市面上的现有方案要么藏在大型库深处,要么过度复杂化。这促使我打造了自己的轻量级解决方案——TinyResult。
✨ TinyResult核心价值 这个开源库的诞生源于三个核心追求:
🛠️ 基础用法实战 快速安装
dotnet add package TinyResult
创建结果对象
var success = Result<int>.Success(42);
var failure = Result<int>.Failure(ErrorCode.NotFound, "Item not found");
模式匹配处理
var message = success.Match(
value => $"Success: {value}",
error => $"Error: {error.Message}"
);
🔄 流水线式操作(Fluent API) 构建链式处理流程:
var result = ResultPipeline<int>
.Start(10)
.Map(x => x * 2)
.Validate(x => x > 0, ErrorCode.ValidationError, "数值必须为正")
.OnSuccess(x => Console.WriteLine($"结果值:{x}"))
.OnFailure(error => Console.WriteLine($"错误:{error.Message}"))
.Build();
🔍 错误处理增强 结构化错误信息
var error = Error.Create(
ErrorCode.ValidationError,
"输入无效",
new Dictionary<string, object>
{
{ "字段", "邮箱" },
{ "值", "invalid-email" }
}
);
异步支持
var asyncResult = await Result.FromTryAsync(
async () => await GetDataAsync(),
ex => Error.Create(ErrorCode.InternalError, "数据获取失败", ex)
);
🧩 多结果合并 简单合并
var combinedResult = Result.Combine(
Result<int>.Success(10),
Result<int>.Success(20),
(v1, v2) => v1 + v2
);
批量合并
var combinedResults = Result.Combine(
new[]
{
Result<int>.Success(1),
Result<int>.Success(2),
Result<int>.Success(3)
}
);
🔄 验证链式调用
var validationResult = ValidationResult.Create()
.AddError("邮箱", "格式无效")
.AddError("密码", "长度不足");
💡 设计哲学 与传统方案对比: | 特性 | TinyResult | 传统try-catch | |---------------------|--------------------------|------------------------| | 代码可读性 | 声明式流水线 | 嵌套控制流 | | 错误信息 | 结构化元数据 | 异常堆栈跟踪 | | 异步支持 | 原生async/await | 需手动封装 | | 类型安全 | 编译时检查 | 运行时异常 |
技术宣言:
当你的代码开始出现"if (result.IsSuccess)"的重复模式时,就该考虑引入TinyResult了。它不是简单封装——而是通过声明式API重构错误处理逻辑,让业务代码回归纯粹的表达力。