实现一个对象验证库系列 -- 2) 验证器实现 (请大神批评)

实现一个对象验证库系列 -- 2) 验证器实现 (请大神批评),第1张

概述前情回顾:上一篇1) 接口介绍以及总体思路概述简单描述了下库的设计思路本文将说说验证器实现,欢迎大神指导更快更好的方案2) 验证器实现我们首先从用户调用的验证器开始实现,所以我们应该首先这样做publ 前情回顾:

上一篇 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) 验证器实现 (请大神批评)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213367.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存