缘由
写该系列缘由是因为之前在国庆无聊实现了一个对象验证的小库,
并希望博客园内的大神能批评教育一下我的这个库,让我能成长一些。
但是估计由于我没有介绍库的内容以及我的思路,只是给出了代码,
大神们对此没太大的兴趣,
所以最近开始我会写一个几篇简单介绍性文章的系列来阐述该库的内容。
希望有幸能被大神们看见并给予我一些批评。
系列目录
1) 接口介绍以及总体思路概述
本片正文 :库结构介绍
(0)库介绍
本人是设想库的使用者可以用 Fluent 的方式创建对象的验证规则,
并且库由于不太涉及.net不同设备平台的特有代码,所以我是使用Portable 方式编写该库。
设想的库使用方式代码如下:
Container.Init(); // Only need init in your app once,目的是绑定类型与接口var builder = Validation.NewValidatorBuilder<Student>(); // 创建验证创建者b.RuleFor(i => i.Age) .Must(i => i >= 0 && i <= 18) .OverrideName("student age") .OverrideError("not student") .ThenRuleFor(i => i.Name) .Must(i => !string.IsNullOrWhiteSpace(i)) .OverrideName("student name") .OverrideError("no name");// 设置验证规则 var v = builder.Build(); // 利用创建者创建验证器var student = new Student() { Age = 13, Name = "v" }; // 验证对象数据var context = Validation.CreateContext(student); // 创建验证上下文,因为上下文中有执行相关的参数var result = v.Validate(context); // 使用验证器验证student数据Assert.IsNotNull(result);Assert.True(result.IsValid);Assert.True(result.Failures.Count == 0); // 验证结果的对比测试
(1)库代码结构介绍
项目结构如下图:
UnitTest :单元测试代码 (这个不用介绍了吧)
ObjectValidater :库只有这一个项目
- Base : 验证规则,规则创建者,规则选择器,验证器等实际实现代码
- Checkers :各种验证方式的具体实现
- Common :与库业务定义或者逻辑无关,提供便利地公用扩展方法或者类的实现
- Entities :验证上下文,验证结果定义
- Interfaces :各种接口的定义
- Container 类:用于接口与实现类型绑定的解耦设置静态类
- Syntax 类:提供Fluent使用方式的扩展方法定义
- Validation 类:因为想将接口与实际实现解耦,所以不便于让用户自行 new 对象,只能提供创建的静态类
(2)项目依赖
目前该库只有一个依赖 Autofac,由于解耦接口和具体实现:
<package id="Autofac" version="3.5.2" targetFramework="portable-net40+sl50+win80+wp80+wpa81" />
NEXT: 1) 接口介绍以及总体思路概述
- 1楼Choo
- .net 自身就有的,using System.ComponentModel.DataAnnotations; protected static bool VerifyModel(object instance, ref string message) { var context = new ValidationContext(instance, null, null); var results = new Listlt;ValidationResultgt;(); var valid = Validator.TryValidateObject(instance, context, results, true); if (!valid) { message = results.Aggregate(message, (current, item) =gt; current + (item.ErrorMessage + quot;;quot;));