上一篇 1) 接口介绍以及总体思路概述 简单描述了下库的设计思路
本文将说说验证器实现,欢迎大神指导更快更好的方案
2) 验证器实现我们首先从用户调用的验证器开始实现,所以我们应该首先这样做
public class ValIDator : IValIDator{ public IValIDateResult ValIDate(ValIDateContext context) { }}
但是我们的验证器不是没有规则嘛?回忆一下我们好像是在为 Fluent 设计时添加了一个验证器设置规则的接口,所以我们应这样实现验证器:
public class ValIDator : IValIDatorSetter{ private List<IValIDateRule> m_Rules = new List<IValIDateRule>(); // 保存验证规则 public voID SetRules(IEnumerable<IValIDateRule> rules) { ParamHelper.CheckParamNull(rules,"rules","Can't be null"); m_Rules.AddRange(rules); // 添加验证规则 } public IValIDateResult ValIDate(ValIDateContext context) { ParamHelper.CheckParamNull(context,"context","Can't be null"); var List = context.RuleSetList; if (!List.IsEmptyOrNull()) { context.RuleSetList = List.Where(i => !string.IsNullOrEmpty(i)).Select(i => i.toupper()).ToArray(); } // 处理验证规则分组标志筛选列表 var rules = m_Rules.Where(i => context.RuleSelector.CanExecute(i,context)).ToArray(); // 筛选验证规则 var result = Container.Resolve<IValIDateResult>(); if (!rules.IsEmptyOrNull()) { var tasks = rules.Select(i => Task.Factory.StartNew(() => i.ValIDate(context))).ToArray(); Task.WaitAll(tasks); // 执行验证 if (tasks.Any(i => i.IsFaulted)) { var exceptions = tasks.Where(i => i.IsFaulted) .Select(i => i.Exception); throw new AggregateException(exceptions); } // 处理task 的异常情况 var failures = tasks.Where(i => i.IsCompleted) .SelectMany(i => i.Result.Failures); result.Merge(failures); // 处理 验证结果 } return result; }}
接着我们再实现验证规则:
public class ValIDateRule : IValIDateRule{ public IValIDateRule NextRule { get; set; } public string RuleSet { get; set; } public string Valuename { get; set; } public string Error { get; set; } public Func<ValIDateContext,bool> Condition { get; set; } public Func<ValIDateContext,string,IValIDateResult> ValIDateFunc { get; set; } public IValIDateResult ValIDate(ValIDateContext context) { ParamHelper.CheckParamNull(ValIDateFunc,"ValIDateFunc","Can't be null"); ParamHelper.CheckParamNull(context,"Can't be null"); IValIDateResult result = null; if (Condition == null || Condition(context)) // 判断用户的特殊过滤条件 { result = ValIDateByFunc(context); // 执行规则的验证 } else { result = Container.Resolve<IValIDateResult>(); } return result; } public IValIDateResult ValIDateByFunc(ValIDateContext context) { IValIDateResult result = ValIDateFunc(context,Valuename,Error); //执行当前规则的验证逻辑 var nextRule = NextRule; if (nextRule != null && (result.IsValID || context.Option == ValIDateOption.Continue)) // 判断是否有必要执行子级验证规则 { var nextResult = nextRule.ValIDate(context); // 执行子级验证规则 result.Merge(nextResult.Failures); // 处理子级验证结果 } return result; }}
等等,好像我们还没有实现验证规则分组标志筛选器,好吧,我们实现它吧
public class RuleSelector : IRuleSelector{ public bool CanExecute(IValIDateRule rule,ValIDateContext context) { return string.IsNullOrEmpty(rule.RuleSet) || context.RuleSetList.IsEmptyOrNull() ? true : context.RuleSetList.Contains(rule.RuleSet); }}
我们把目前的实现与接口绑定到容器中:
public static class Container{ public static IlifetimeScope CurrentScope { get; set; } public static voID Init(Action<ContainerBuilder> action) { ParamHelper.CheckParamNull(action,"action","Can't be null"); Clear(); var builder = new ContainerBuilder(); action(builder); var container = builder.Build(); CurrentScope = container.BeginlifetimeScope(); } public static voID Init() { Init(builder => { // 绑定接口 builder.RegisterType<RuleSelector>().As<IRuleSelector>().SingleInstance(); builder.Register(c => new ValIDateContext() { RuleSelector = c.Resolve<IRuleSelector>() }); builder.RegisterType<ValIDateRule>().As<IValIDateRule>().InstancePerDependency(); builder.RegisterType<ValIDateResult>().As<IValIDateResult>().InstancePerDependency(); builder.RegisterType<ValIDator>().As<IValIDatorSetter>().InstancePerDependency(); }); } public static voID Clear() { var scope = CurrentScope; if (scope != null) scope.dispose(); } public static T Resolve<T>() { return CurrentScope.Resolve<T>(); }}
好吧,我们来简单试试吧:
Container.Init(); // 初始接口var v = new ValIDator();var rule = new ValIDateRule(){ ValIDateFunc = (c,name,error) => { var f = new ValIDateFailure() { name = name,Error = error,Value = c }; return new ValIDateResult(new List<ValIDateFailure>() { f }); }};v.SetRules(new List<ValIDateRule>() { rule });// 简单设置验证var context = new ValIDateContext() { RuleSelector = new RuleSelector() };var result = v.ValIDate(context);// 试用一下Assert.IsNotNull(result);Assert.True(result.IsValID);Assert.IsNotNull(result.Failures);Assert.AreEqual(0,result.Failures.Count);
好吧,没有实现 Fluent 设置验证规则的代码,现在整体看起来真丑啊
NEXT: 3) Fluent以及扩展方法实现
总结以上是内存溢出为你收集整理的实现一个对象验证库系列 -- 2) 验证器实现 (请大神批评)全部内容,希望文章能够帮你解决实现一个对象验证库系列 -- 2) 验证器实现 (请大神批评)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)