Visual Studio DSL 入门 12---状态机设计器的规则(Rule)和验证(Validation)

上一节我们为状态机设计器添加了一个Rule,主要用来处理当Transition的属性 Label,Condition,Action,Event之间的任何一个值发生变化时,其余的属性值也要按照我们 的规则来更新(我们的Label属性就是一个辅助的属性,用来更好的显示和编辑另外三个属性). 我们可以看到vs.net dsl提供的Rule机制的强大,它主要提供了以下几个Rule:

AddRule:当ModelElement或者ElementLink添加时触发

ChangeRule:当一个元素或者关系的属性发生变化时触发

DeleteingRule:删除元素或关系时触发

DeletedRule:删除元素或关系后触发

RolePlayerChangeRule:当域关系的一端发生变化时

RolePlayerPositionChangeRule:对于多重的关系中的角色发生变化

TransactionBeginningRule:事务开始时触发

TransactionCommitingRule  事务提交时触发

TransactionRollingBackRule  事务回滚时触发

另外应该注意的是,AddRule,ChangeRule,DeleteingRule…这些都是在元素添加,更改, 删除同时触发,此时还在事务当中,也就是说,我们可以添加自己的规则,根据我们自定义 的条件取消事务或做一些其它的处理。

但是规则是强制性的,也就是说,在一个规则处理里面,我们如果限制一个属性值的类型 必须是整型,否则就抛出异常,停止此事务的提交。这属于Vs.net Dsl提供的硬约束的一种 实现,相反,还有软约束,那硬约束和软约束有什么不同呢?

硬约束就是指从不让用户违反的约束,比如我们例子中的四个属性之间的这种关系,如果 有些个案,就会导致我们的元数据混乱,生成代码就很麻烦.

软约束是用户有时可以违反,有时又不能违反的约束,或者是说,即使用户违反了,我们 也要保证元数据能够正常保存,正常提交。比如说我们的状态机中没有初始状态. 

一个优秀的Dsl设计器应该是硬约束和软约束结合,软的不行来硬的!  当然,这里提到 Rule只是硬约束的一种,比如我们还可以重载指定域属性值属性处理器内嵌类中的 OnXXXChanged()方法,例如,我们添加一个 partial类ConditionPropertyHandler:

internal sealed partial class ConditionPropertyHandler  :DomainPropertyValueHandler<Transition, string>
   {
     protected override void OnValueChanging(Transition element,  string oldValue, string newValue)
     {
       if (!element.Store.InUndoRedoOrRollback)
       {
         if (!string.IsNullOrEmpty(newValue))
         {
           element.Label = ComputeSummary(newValue,  element.Condition, element.Action);
         }
       }
       base.OnValueChanging(element, oldValue, newValue);
     }
   }

时间: 2024-11-16 20:14:01

Visual Studio DSL 入门 12---状态机设计器的规则(Rule)和验证(Validation)的相关文章

Visual Studio DSL 入门 11---为状态机设计器添加规则

上一节我们在设计器的显示方面进行了完善,在这一节,我们将深入状态机设计器的一些逻辑细节,给我 们的设计器添加逻辑规则.为生成代码做好准备. 在开始之前,我们先看一下Transition的几个属性之间的关系: 1.编辑Event,Condition,Action属性时,Label属性能够自动计算显示,计算逻辑为Event [Condition] / Action 2.当修改属性Label时,Event,Condition,Action的值也能够对应自动更新. 我们使用Vs.net Dsl的规则来实

Visual Studio DSL入门系列

Visual Studio DSL 入门 11---为状态机设计器添加规则 Visual Studio DSL 入门14---用Wix制作安装程序 Visual Studio DSL 入门 13---结合T4生成代码 Visual Studio DSL 入门 12---状态机设计器的规则(Rule)和验证(V Visual Studio DSL入门 10---完善状态机案例 Visual Studio DSL入门 9---创建状态机的图形符号 Visual Studio DSL入门 8---创建

Visual Studio DSL 入门 2

相信如果看过一上篇你已经对vs.net dsl有了一定的了解,接下来我们就来开始我们的这个系列的入门,Vs.net Dsl在国内可能使用的人少之又少,不过希望这个系列能够使看到的人能够对dsl有一定的了解,使之能够成为产品方案选型时的一个参考,能够对阅读的人有所帮助. 准备环境     由于vs.net 2010并未正式发布,所以这一系列基于vs 2008 sp1进行开发,Dsl tools是包含在VSX当中的,所以需要下载 Vistual Stutio.Net SDK 1.1安装,下载地址为:

艾伟_转载:Visual Studio DSL 入门 2

     相信如果看过一上篇你已经对vs.net dsl有了一定的了解,接下来我们就来开始我们的这个系列的入门,Vs.net Dsl在国内可能使用的人少之又少,不过希望这个系列能够使看到的人能够对dsl有一定的了解,使之能够成为产品方案选型时的一个参考,能够对阅读的人有所帮助. 准备环境     由于vs.net 2010并未正式发布,所以这一系列基于vs 2008 sp1进行开发,Dsl tools是包含在VSX当中的,所以需要下载 Vistual Stutio.Net SDK 1.1安装,下

Visual Studio DSL 入门14---用Wix制作安装程序

我们到现在为止已经对Vs.net dsl的基础知识进行了介绍,并且一步一步的完成了我们的状态机设计器的设计,在上一节结合T4模板生成了代码.但是我们一直还是在调试的项目中来做的, 怎么能够让我们做的这个状态机设计器能够提供给其它人使用呢,在这一节,我们就来做一个安装程序,这样在只安装了VS.NET的机器上,不用安装SDK就可以使用我们的设计器了. VS.NET DSL专门提供了针对DSL的安装项目,我们直接基于这个项目来制作我们的安装程序: 1.首先,向我们的解决方案中添加一个Dsl 安装项目,

一起谈.NET技术,Visual Studio DSL 入门 1

什么是特定领域开发和DSL      特定领域开发是用来解决重复发生的问题的方法,针对每次发生的问题,通过进行总结和分析,他们之间相同的方面可以一次性的解决.而经常变化的方面,可以采用一种特殊的语言表达.针对这个特殊语言,我们可以建立模型或者表达式,然后插入到固定部分.       对于我们软件行业的解决方案来说,固定部分一般采用传统的设计和实现方式,可以为框架,平台,解释器或者编程接口.提供可扩展性,具有高度的抽象性和可复用性.而特定领域语言专门用来创建变化的部分,从而使整个解决方案可具有可应

Visual Studio DSL 入门 13---结合T4生成代码

在前面的几节里,我们已经完成了一个简单的状态机设计器,通过这个状态机可以设计出一 个状态流,但是如果只是这样,我们直接使用UML设计工具就行了,何必自己开发呢? 我们走的 是模型驱动开发路线,呵呵,注意哥说的是开发,不是设计.这一节就和我们的开发联系起来,生 成符合我们要求的代码. 结合vs.net dsl生成代码有以下几种方式: 直接硬编码,在代码里面利用模型拼接生成的代码,我记得activewriter就是这样做的生成 nhibernate代码. 结合模板引擎,你可以使用xslt或者t4(t

Visual Studio DSL入门 7---DSL的图形表示2

模型元素由形状来表示,而域关系则用连接器(Connectors)来表示.图形映射定义了模型元素通过形状可视化表示出来,而连接器映射定义了链接如何通过连接器可视化表示出来. 形状映射 我们先来看一下形状映射,接着打开我们的LanguageSm项目中的Dsl文件. 选中域类ExampleElement与图形ExampleShape之间的线,可看下面的Dsl details: 这个窗口有两个tab,General tab主要是定义域类和图形间的连接, 可以选择形状,域类,设置他们之间的映射关系,Par

一起谈.NET技术,Visual Studio DSL 入门 3---创建一个简单的DSL模型

     从这节开始我们就开始我们的DSL之旅, 首先确保你已经安装了Visual Studio Sdk,并且使用的是Visual Studio 2008.我们先大概创建一个简单的DSL项目,通过这个项目来了解dsl的开发环境和流程. 1. 打开VS.NET ,新建--项目, 点击其它项目类型--扩展性(Extensibility). 这里列出来了vs.net扩展类型的项目,包括Addin,VSPackage,Dsl等项目类型,选择"Domain Specific Lan  guage Desi