抽取非基本验证到规则文件:A2D规则引擎2014-07-03基本验证与业务验证,基本验证就是始终保持不变的验证规则,可以通过如下硬编码实现:
public class Order{[Required][Range(typeof(decimal), "1", "10000")]public decimal Price { get; set; }[Required][StringLength(30)]public string Customer { get; set; }[Required(AllowEmptyStrings=true)][StringLength(50)]public string StoreID { get; set; }}
然后在用如下代码validate, 把错误放到List中:
private bool ValidateBasicRule(Order order){List<KeyValuePair<string, string>> errors = order.IsValid();if (errors.Count > 0){this.AddRange(errors);return false;}return true;}public static class DataAnnotationHelper{public static List<KeyValuePair<string, string>> IsValid<T>(this T o){List<KeyValuePair<string, string>> errors = new List<KeyValuePair<string, string>>();var descriptor = GetTypeDescriptor(typeof(T));foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties()){foreach (var validationAttribute in propertyDescriptor.Attributes.OfType<ValidationAttribute>()){if (!validationAttribute.IsValid(propertyDescriptor.GetValue(o))){errors.Add(new KeyValuePair<string, string>(propertyDescriptor.Name, validationAttribute.FormatErrorMessage(propertyDescriptor.Name)));}}}return errors;}private static ICustomTypeDescriptor GetTypeDescriptor(Type type){return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type);}}
然后说说业务规则的易变SaaS程序,或者业务规则极其易变时,就要采用其他方法来做了,不可能每个公司都用设计模式分开写(虽然也行,但是不方便,公司业务规则多了后,对这些规则代码的管理就是很高的成本,而且要developer来负责)。所以要用规则文件来分开规则的编写,好处:把修改的职责交给别人,比如项目经理、项目实施人员代码不需要重新编译就能实现业务规则的修改我们来解决下这个易变问题,假设有2公司:A和B。A公司验证规则:基本验证(就是Order类的验证规则的硬编码)自定义验证规则:当前Order的下单网址必须来自于这几个url,如:www.cnblogs.com、www.cnblogs1.com、www.cnblogs2.comB公司验证规则:基本验证(同上)自定义验证规则:无如果用A2D规则引擎来解决的话,需要怎么做呢?第一步当然是编写规则文件,A公司的规则文件:
declareallowStores=["www.cnblogs.com", "www.cnblogs1.com", "www.cnblogs2.com"]end declarerule "test"when!_.contains(allowStores, entity.StoreID)thenerrors.Add("StoreID", "StoreID value not right")end rule
由于B公司没有自定义规则,因此不需要编写相应的规则文件