关于RuleSet Engine的用法

最近在维护一个项目,遇到阿三程序员写的一段关于WWF的代码.其中使用了RuleSet, RuleValidation 和 RuleExecution 三个方法,这三个方法把我弄的很郁闷.首先,我能看明白这几个方法, 就是将生成的Rules通过DeserializeRuleSet这个方法来反序列化,变成RuleSet对象, 然后用RuleValidation对象来声明需要操作对象(objClass),然后让RuleSet对象根据事先已经写好了的对象直接执行就可以了.... 所谈的代码,我去掉了try catch和if判断. 如下.
  1.    private RuleSet DeserializeRuleSet(string ruleSetXmlDefinition)
  2.         {
  3.             RuleSet result = null;
  4.             System.Workflow.Activities.Rules.Rule rule = new System.Workflow.Activities.Rules.Rule();
  5.             if(!String.IsNullOrEmpty(ruleSetXmlDefinition))
  6.             {
  7.                 XmlReader reader = XmlReader.Create(new StringReader(ruleSetXmlDefinition));
  8.                 //reader = XmlTextReader.Create(@"D:/user.rules");
  9.                 result = serializer.Deserialize(reader) as RuleSet;
  10.             }
  11.             return result;
  12.         }
  13.         public void ExecuteRuleSet(object objClass,string xmlString)
  14.         {
  15.             RuleValidation ruleValidation = new RuleValidation(objClass.GetType(),null);
  16.             RuleExecution ruleExecution = new RuleExecution(ruleValidation,objClass);
  17.             RuleSet ruleSet = DeserializeRuleSet(xmlString);
  18.             ruleSet.Execute(ruleExecution);
  19.         }
由于不明白RuleSet是如何创建的,便咨询阿三,结果是"我们自己写了一个工具来生成规则,你只要用就行了".这话听的我很不爽,顺便BS一下.

于是我决定来研究这个东西,看了他源数据库里面存储的Rules的格式来看,应该是由RuleSet Editor生成的. 但是令人郁闷的是,我创建了WWF项目,然后将Policy生成的rules文件(是RuleSet Editor),读出出来,做为ExecuteRuleSet的参数来,结果反序列化的时候,失败.原因很明显,是我创建rules的方法不对.于是我在网上游荡了近两个周,在若干次失败之后,终于找到了生成RuleSet的方法.  经过无数的夜晚的沉思,互联网的搜索,终于找到了方法.

为了生成这个RuleSet规则,我特地的创建了一个windows的项目. "阿三" 的生成RuleSet引擎的工具大概也就是这么个东西,无非是他可以将Rules再序列化出来,结果是添加到数据库里面.这里不是我要做的,我要找到是他怎么生成这个RuleSet.
  1.        private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             Type entityType = typeof(Users);
  4.             RuleSet ruleSet = new RuleSet();
  5.             RuleSetDialog dialog = new RuleSetDialog(entityType, null, ruleSet);
  6.             DialogResult result = dialog.ShowDialog(this);
  7.             if (result == DialogResult.OK)
  8.             {
  9.                 SerializeRuleSet(dialog.RuleSet);
  10.             }
  11.         }
  12.         private void SerializeRuleSet(RuleSet ruleSet)
  13.         {
  14.             StringBuilder ruleSetXml = new StringBuilder();
  15.             using (XmlWriter xmlWriter = XmlWriter.Create(ruleSetXml))
  16.             {
  17.                 new WorkflowMarkupSerializer().Serialize(xmlWriter, ruleSet);
  18.             }
  19.             XmlDocument xmlDoc = new XmlDocument();
  20.             xmlDoc.LoadXml(ruleSetXml.ToString());
  21.             xmlDoc.Save("user.rules");
  22.         }
来简单解释一下Users, 就是要进行验证的对象,这里我创建了一个Users的类,里面有几个成员Age,Name.这个其实并不重要,我这里主要讲怎么样使用这个RuleSet引擎,在使用RuleSetDialog的时候,会弹出一个和你在使用图形化的编辑Policy或者是WorkFlow的时候弹出的对话框是一样的.需要你来添加规则.添加结束之后.会返回,返回的时候,取出 dialog的RuleSet方法,并将这个方法序列化. 保存为user.rules,当然,保存成什么格式.保存到哪里并不重要.重要的是,这个规则我们已经生成了.

最后回到开头讲的,将 我自己定义的Users类和刚刚生成的Ruels对象代入到ExecuteRuleSet(). 成功通过验证....
至于如何添加规则,就不属于这里讨论的范围了,网上WWF教程就有很多了.
我参考的文章: http://melgrubb.spaces.live.com/Blog/cns!A44BB98A805C8996!182.entry

我的环境是VisualStudio 2008 Perfessional Framework3.5 SP1 以上代码所用到的命名空间.
  1. using System.Workflow.Activities.Rules;
  2. using System.Workflow.ComponentModel.Compiler;
  3. using System.Workflow.ComponentModel.Serialization;
  4. using System.Workflow.Activities.Rules.Design;
  5. using System.XML;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值