最近在维护一个项目,遇到阿三程序员写的一段关于WWF的代码.其中使用了RuleSet,
RuleValidation 和
RuleExecution 三个方法,这三个方法把我弄的很郁闷.首先,我能看明白这几个方法, 就是将生成的Rules通过DeserializeRuleSet这个方法来反序列化,变成RuleSet对象, 然后用RuleValidation对象来声明需要操作对象(objClass),然后让RuleSet对象根据事先已经写好了的对象直接执行就可以了.... 所谈的代码,我去掉了try catch和if判断. 如下.
由于不明白RuleSet是如何创建的,便咨询阿三,结果是"我们自己写了一个工具来生成规则,你只要用就行了".这话听的我很不爽,顺便BS一下.
于是我决定来研究这个东西,看了他源数据库里面存储的Rules的格式来看,应该是由RuleSet Editor生成的. 但是令人郁闷的是,我创建了WWF项目,然后将Policy生成的rules文件(是RuleSet Editor),读出出来,做为ExecuteRuleSet的参数来,结果反序列化的时候,失败.原因很明显,是我创建rules的方法不对.于是我在网上游荡了近两个周,在若干次失败之后,终于找到了生成RuleSet的方法. 经过无数的夜晚的沉思,互联网的搜索,终于找到了方法.
为了生成这个RuleSet规则,我特地的创建了一个windows的项目. "阿三" 的生成RuleSet引擎的工具大概也就是这么个东西,无非是他可以将Rules再序列化出来,结果是添加到数据库里面.这里不是我要做的,我要找到是他怎么生成这个RuleSet.
来简单解释一下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 以上代码所用到的命名空间.
- private RuleSet DeserializeRuleSet(string ruleSetXmlDefinition)
- {
- RuleSet result = null;
- System.Workflow.Activities.Rules.Rule rule = new System.Workflow.Activities.Rules.Rule();
- if(!String.IsNullOrEmpty(ruleSetXmlDefinition))
- {
- XmlReader reader = XmlReader.Create(new StringReader(ruleSetXmlDefinition));
- //reader = XmlTextReader.Create(@"D:/user.rules");
- result = serializer.Deserialize(reader) as RuleSet;
- }
- return result;
- }
- public void ExecuteRuleSet(object objClass,string xmlString)
- {
- RuleValidation ruleValidation = new RuleValidation(objClass.GetType(),null);
- RuleExecution ruleExecution = new RuleExecution(ruleValidation,objClass);
- RuleSet ruleSet = DeserializeRuleSet(xmlString);
- ruleSet.Execute(ruleExecution);
- }
于是我决定来研究这个东西,看了他源数据库里面存储的Rules的格式来看,应该是由RuleSet Editor生成的. 但是令人郁闷的是,我创建了WWF项目,然后将Policy生成的rules文件(是RuleSet Editor),读出出来,做为ExecuteRuleSet的参数来,结果反序列化的时候,失败.原因很明显,是我创建rules的方法不对.于是我在网上游荡了近两个周,在若干次失败之后,终于找到了生成RuleSet的方法. 经过无数的夜晚的沉思,互联网的搜索,终于找到了方法.
为了生成这个RuleSet规则,我特地的创建了一个windows的项目. "阿三" 的生成RuleSet引擎的工具大概也就是这么个东西,无非是他可以将Rules再序列化出来,结果是添加到数据库里面.这里不是我要做的,我要找到是他怎么生成这个RuleSet.
- private void Form1_Load(object sender, EventArgs e)
- {
- Type entityType = typeof(Users);
- RuleSet ruleSet = new RuleSet();
- RuleSetDialog dialog = new RuleSetDialog(entityType, null, ruleSet);
- DialogResult result = dialog.ShowDialog(this);
- if (result == DialogResult.OK)
- {
- SerializeRuleSet(dialog.RuleSet);
- }
- }
- private void SerializeRuleSet(RuleSet ruleSet)
- {
- StringBuilder ruleSetXml = new StringBuilder();
- using (XmlWriter xmlWriter = XmlWriter.Create(ruleSetXml))
- {
- new WorkflowMarkupSerializer().Serialize(xmlWriter, ruleSet);
- }
- XmlDocument xmlDoc = new XmlDocument();
- xmlDoc.LoadXml(ruleSetXml.ToString());
- xmlDoc.Save("user.rules");
- }
最后回到开头讲的,将 我自己定义的Users类和刚刚生成的Ruels对象代入到ExecuteRuleSet(). 成功通过验证....
至于如何添加规则,就不属于这里讨论的范围了,网上WWF教程就有很多了.
我参考的文章: http://melgrubb.spaces.live.com/Blog/cns!A44BB98A805C8996!182.entry
我的环境是VisualStudio 2008 Perfessional Framework3.5 SP1 以上代码所用到的命名空间.
- using System.Workflow.Activities.Rules;
- using System.Workflow.ComponentModel.Compiler;
- using System.Workflow.ComponentModel.Serialization;
- using System.Workflow.Activities.Rules.Design;
- using System.XML;