更新内容
完全基于表达式树的模型验证器
本版本,我们带来了基于表达式树实现的模型验证器。并实现了很多内置的验证方法。
我们罗列了与 FluentValidation 比较的情况:
| Build in Validators |
FluentValidation 9.X |
Newbe.ObjectVistor |
| NotNull |
✔️ |
✔️ NotNull; class |
| NotEmpty |
✔️ |
✔️ NotEmpty; string,enumerable |
| NotEqual |
✔️ |
✔️ NotEqual; all |
| Equal |
✔️ |
✔️ Equal; all |
| Length |
✔️ |
✔️ Length; string,enumerable |
| MaxLength |
✔️ |
✔️ MaxLength; string,enumerable |
| MinLength |
✔️ |
✔️ MinLength; string,enumerable |
| Less Than |
✔️ |
✔️ LessThan; number |
| Less Than Or Equal |
✔️ |
✔️ LessThanOrEqual; number |
| Greater Than |
✔️ |
✔️ GreaterThan; number |
| Greater Than Or Equal |
✔️ |
✔️ GreaterThanOrEqual; number |
| Predicate |
✔️ |
✔️ Validate; all |
| Regular Expression |
✔️ |
✔️ MatchRegex,NotMatchRegex; string |
| Email |
✔️ |
💭 MatchRegex; string |
| Credit Card |
✔️ |
💭 MatchRegex; string |
| Enum |
✔️ |
✔️ IsInEnum; number,string,enum |
| Enum Name |
✔️ |
✔️ IsEnumName; string |
| Empty |
✔️ |
✔️ Empty; string,enumerable |
| Null |
✔️ |
✔️ Null; class |
| ExclusiveBetween |
✔️ |
✔️ IsInRange; number,enum |
| InclusiveBetween |
✔️ |
✔️ IsInRange; number,enum |
| ScalePrecision |
✔️ |
✔️ ScalePrecision; number |
| Or |
❌ |
✔️ Or; all |
| IsInSet |
❌ |
✔️ IsInSet; all |
| IsNotInSet |
❌ |
✔️ IsNotInSet; all |
| CanParse |
❌ |
🚧 CanParse; all |
FluentAPI 生成器重构的代码
我们基于 0.3 已经发布的 FluentAPI 进行了核心代码重构,现在一些特定场景下需要您指定的泛型参数更少了,但是功能没有减少,更有利您进行开发。
类似的,例如下面这个变更:
// create a data visitor to cover sensitive data
_visitor = default(UserModel).V()
- .ForEach<UserModel, string>(x => CoverSensitiveData(x))
+ .ForEach<string>(x => CoverSensitiveData(x))
.Cache();
同时支持英文与简体中文方法注释
在热心网友 EventHorizon1024 的帮助下,我们在保留英文作为原始注释的情况下,对使用简体中文 IDE 的开发者们提供了全简中的方法说明。
开发者无需特殊操作,便可以在 IDE 中直接查看到简体中文的方法注释。
如何实现的详细操作方法,开发者也可以通过以下链接借鉴使用:
https://github.com/dotnet/roslyn/issues/3371#issuecomment-737623706
开发文章站点正式上线
我们非常顺利的上线了开发文档站点:
后续所有关于本工具包相关的文章除了在博客 https://www.newbe.pro 及相关博客公布之外,我们将会更新以上站点,丰富其中的文档。
目前,我们已经上线了几篇简单的文档:
项目说明
Newbe.ObjectVisitor 帮助开发者可以用最简单的最高效的方式访问一个普通 class 的所有属性。从而实现:验证、映射、收集等等操作。
例如, 在你的代码中有这样一个简单的类。
var order = new OrderInfo();
你想要将这个类所有的属性和值都打印出来,那么你可以采用反射来完成:
for(var pInfo in typeof(OrderInfo).GetProperties())
{
Console.Writeline($"{pInfo.Name}: {pInfo.GetValue(order)}");
}
如果你使用这个类库,则可以采用以下方式来实现一样的效果:
// call .V what is a static extension method
// you get a visitor object for order
var visitor = order.V();
visitor.ForEach(context=>{
var name = context.Name;
var value = context.Value;
Console.Writeline($"{name}: {value}");
}).Run();
// you can also make it into one line
order.V().ForEach(c=> Console.Writeline($"{c.Name}: {c.Value}")).Run();
// or using quick style
order.FormatToString();
那我为什么要这样做?
- 因为这样更快!这个类库使用表达式树实现,因此它拥有比直接使用反射快上10倍的性能.
- 因为这样更可读!通过这个类库你可以使用链式API和命名方法来创建一个委托,这样可以让你的代码实现和硬编码同样的可读效果。
- 因为这样更具扩展性!如果使用了这个类库,你就拥有了一个简便的方法来访问一个类所有的属性。因此,你就做很多你想做的事情,比如:创建一个验证器来验证你的模型,修改一些可能包含敏感数据的属性从而避免输出到日志中,创建一个类似于AutoMapper的对象映射器但是拥有更好的性能,诸如此类。
GitHub 项目地址:https://github.com/newbe36524/Newbe.ObjectVisitor
Gitee 项目地址:https://gitee.com/yks/Newbe.ObjectVisitor
![Newbe.ObjectVisitor]()