Csla框架之命令对象理解

  今晚整理了一下前段时间做的一个小型工作流应用程序,其核心的功能块是用的Csla框架试用开发,今天就对Csla框架中的命令对象做下个人理解。

  众所周知,在工作流的开发过程中,可以分为流程定义过程、流程运行过程和工作任务的跟踪,特别是流程实例运行的过程中,主要的实现可以总结为流程实例创建、任务提交、任务回退、办结、抄送等等,其中的每个功能具有一定的相对独立性,而且大多数的操作都是命令提交后一次性办理,基于这种想法,自己在实现过程中对于上述的功能使用Csla框架的命令对象进行实现。

  区别于Csla框架中的其他对象,可以说它的基本代码块是所有的对象类型中最简单的,代码中只有静态工厂方法及命令的执行代码DataPortal_Execeut(),它可以存在于其他对象内部,作为内部类来被外层类调用,也可以公开类型被其他所有代码使用,而且命令对象的初始化是在客户端,所以可以在客户端对命令对象及内部成员进行初始化,也可以在传递到服务端之前在客户端进行数据的有效性验证,其中运行在服务器端的方法只有DataPortal_Execeut()。它可以只是一个简单的进行一项数据个数的统计,也可以复杂到调用另外其他的N个类来实现此次命令操作,并且可以将操作的结果反应在字段中供客户端进行接收。下面就贴出一个简化后的命令对象:

   1:      /// <summary>
   2:      /// 分发抄送信息
   3:      /// </summary>
   4:      [Serializable]
   5:      public class ShareNode : Csla.CommandBase
   6:      {
   7:          //抄送的节点ID
   8:          private int _NodeID;
   9:   
  10:          //要抄送的用户列表
  11:          private List<string> _ShareUser;
  12:   
  13:          private ShareNode(int nodeID, List<string> shareUser)
  14:          {
  15:              this._NodeID = nodeID;
  16:              this._ShareUser = shareUser;
  17:          }
  18:   
  19:          public static void Execute(int nodeID, List<string> shareUser)
  20:          {
  21:              ShareNode com = new ShareNode(nodeID, shareUser);
  22:              com = DataPortal.Execute<ShareNode>(com);
  23:          }
  24:   
  25:          protected override void DataPortal_Execute()
  26:          {
  27:              if (_NodeID == null || _NodeID <= 0 || _ShareUser == null || _ShareUser.Count <= 0)
  28:              {
  29:                  return;
  30:              }
  31:              foreach (var item in _ShareUser)
  32:              {
  33:                  ShareNode data = ShareNode.NewShareNode();
  34:                  data.ID = _NodeID;
  35:                  data.Date = DateTime.Now.ToString();
  36:                  data.ShareUser = item;
  37:                  data.ReadDate = DateTime.MaxValue.ToString();
  38:                  data.State = false;
  39:                  data.Type = ShareType.Node.ToString();
  40:   
  41:                  data.Save();
  42:              }
  43:          }
  44:      }

上面是自己以前实现的一个简单的流程抄送功能,其中,抄送的命令对象ShareNode是在客户端调用工厂方法进行实例化的,并且通过调用私有构造方法进行对字段初始化(在实例化前可以对传递的参数进行验证,避免到服务器端后才发现初始化数据有误)。调用实例的Execute方法实例对象的移动,在服务端(当然也可能是配置在本地)调用DataPortal_Execute方法,在内部实现自己需要实现的功能。在这里只是一个简单的数据操作,如果复杂的话命令对象还可能会返回更复杂的对象类型,无论是在客户端还是在服务器端还可能存在更复杂的业务代码。

  自己感觉,简单的看它,它只是一个访问远程代码的入口,就像是调用wcf其中一个方法那样,但从它的名称“命令对象”中看得出,作者将命令这种东西也作为了对象进行看待,就像是自己在实现工作流中,其中每个命令都可以作为一个命令对象的方式存在,第一感觉就是清晰,无论命令对象里面进行了如何复杂的代码实现。可能需要注意的是命令的执行过程如果操作多次数据库的话就需要将对象的方法标识为事务属性以防万一。

  框架中的每种类型的对象都有其使用的条件,就像是这种命令对象,在处理命令操作中可以发挥出它的灵活性。

  当然,这种用法是站在使用此框架的角度来思考,除此之外还有很多办法可以实现,还有就是不同的情景对于一个框架来说也可能不适合。还是那句,用它,是为了在使用过程中学习更多的知识。

  最后需要注意的是,在框架中,所有的业务对象,包括条件对象(Criteria) 都要标识为可序列化!这点我想在平常类的使用中也是要标识的...

posted @ 2011-04-08 00:08  屈鲁奇  阅读(1362)  评论(1编辑  收藏  举报