Csla框架之业务与验证规则

  看时间还早,写篇日志消遣消遣。今天来回顾一下Csla框架中的业务与验证规则,这个功能也是作者在框架中重 点实现的一个方面,意图是在业务对象中以一种标准的方式来支持和处理数据有效性规则的验证。(提前说明的一点是,学习此框架的首要目的是提高软件开发思维能力,所以内容可能有些针对此框架,同时夹杂着个人想法,如有错误请指教。)

  前面在属性联想的章节中也提到在框架中对业务规则的验证,是通过调用属性set时框架自动触发当前属性的业务验证规则;此外,在调用工厂方法创建一个新对象时也可以显示的调用CheckRules()方法来遍历所有验证规则,在特殊的属性关联时,也可以通过属性名称来调用其他属性的验证规则来实现验证。

  对象规则定义的方法有两种,一种被称为每类型的规则,也就是同样的对象类型只实例化一次业务规则,这样会减少系统内在开支,也是框架默认的实现方法;另一种是每实例类型的规则,也就是创建新对象实例时就会为当前对象创建该对象的业务规则信息,可想而之,有些对象的操作权限会根据当前登陆用户来决定,这种情况就会适用。
  在实现验证规则时,作者引入了委托,也就是将验证规则提升为了一定规则的对象类型,通过约定好的规则来定

义每类验证方法,如必填项,数字范围,复杂的可能还会对数据库进行操作等,典型的方法签名如下:

   1:  public delegate bool RuleHandler(object target, RuleArgs e);   
   2:  public delegate bool RuleHandler<T, R>(T target, R e) where R : RuleArgs;
 

可以看出它们的样式特别像事件,其中第2行是实现的范型类型。这样,开发者就可以按规则定义自己的业务方法,再分配给需要规则定义的属性。方法参数中的RuleArgs保存属性信息及验证结果描述信息。

  另外一个辅助类是失效业务规则的跟踪,它会存在于每个对象实例中(而且是在数据违背规则时才会初始化),当赋值操作违背业务规则时系统就会记录当前的错误信息,并通过错误处理接口向客户端的数据绑定提供错误信息(框架实现了数据绑定接口),当用户更新失效数据时系统及时清除当前失效记录。值得一提的是失效记录会随着N层撤销功能一块被拍照及撤销,错误信息也会是在对象保存时系统判断是否能保存的重要依据。

  此功能使用了反射,这个应该不会是讨论点了,常提到的系统性能与可扩展性及可维护性的权衡问题大家心里都明白,这东西不能钻牛角尖。

  在这里也就是大体说一下,希望不会太让大家失望。最后贴一个验证规则样例(源于框架CommonRules类):

   1:          /// <summary>
   2:          /// Rule ensuring a string value contains one or more
   3:          /// characters.
   4:          /// </summary>
   5:          /// <param name="target">Object containing the data to validate</param>
   6:          /// <param name="e">Arguments parameter specifying the name of the string
   7:          /// property to validate</param>
   8:          /// <returns><see langword="false" /> if the rule is broken</returns>
   9:          /// <remarks>
  10:          /// This implementation uses late binding, and will only work
  11:          /// against string property values.
  12:          /// </remarks>
  13:          [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
  14:          public static bool StringRequired(object target, RuleArgs e)
  15:          {
  16:              string value = (string)Utilities.CallByName(
  17:                target, e.PropertyName, CallType.Get);
  18:              if (string.IsNullOrEmpty(value))
  19:              {
  20:                  e.Description = string.Format(Resources.StringRequiredRule, RuleArgs.GetPropertyName(e));
  21:                  return false;
  22:              }
  23:              return true;
  24:          }

 

 

使用方法也挺简单,如下:

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            ValidationRules.AddRule(Csla.Validation.CommonRules.StringRequired, NameProperty);
        }
posted @ 2011-05-18 00:28  屈鲁奇  阅读(1736)  评论(1编辑  收藏  举报