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

上一节我们在设计器的显示方面进行了完善,在这一节,我们将深入状态机设计器的一些逻辑细节,给我 们的设计器添加逻辑规则.为生成代码做好准备.

在开始之前,我们先看一下Transition的几个属性之间的关系:

1.编辑Event,Condition,Action属性时,Label属性能够自动计算显示,计算逻辑为Event [Condition] / Action

2.当修改属性Label时,Event,Condition,Action的值也能够对应自动更新.

我们使用Vs.net Dsl的规则来实现:

1.在Dsl项目下新增CustomCode文件夹来存放我们的自定义的代码,这是Dsl开发中的通用做法,Dsl再强 大也不可能不一点代码不用写就能够使满足需求,一般情况下,无论是在开发Dsl还是在使用Dsl时,都需要 结合生成的代码和自定义代码.在CustomCode文件夹下面新建文件夹 Validation,用于存放手写的自定义 验证类.

2.在Validation文件夹下面添加类TransitionLabelRule.

3.修改TransitionLabelRule继承于ChangeRule,并使用RuleOn属性标签标识此规则应用到域关系 Transition上面.

using Microsoft.VisualStudio.Modeling;

namespace Company.LanguageSm
{
     [RuleOn(typeof(Transition))]
     public sealed class TransitionLabelRule : ChangeRule
     {
     }
}

4.在规则类里面,我们需要实现ChangeRule唯一的一个方法 ElementPropertyChanged (ElementPropertyChangedEventArgs e),从这个方法我们可以看出,当Transition的一些属性发生变化时 就会触发这个规则,参数类型 ElementPropertyChangedEventArgs,这个参数包含当前的模型元素 ModelElement,编辑的属性 DomainProperty,原值OldValue,新值NewValue,我们只需要判断当前的属性,如 果是以上的 Event,Condition,Action,Lable时,修改后就计算其余的属性.

public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e)
         {
             Transition t = e.ModelElement as Transition;

             // Compute Label when Event changes
             if (e.DomainProperty.Id == Transition.EventDomainPropertyId)
                 t.Label = ComputeSummary(e.NewValue as string,  t.Condition, t.Action);

             // Compute Label when Condition changes
             else if (e.DomainProperty.Id ==  Transition.ConditionDomainPropertyId)
                 t.Label = ComputeSummary(t.Event, e.NewValue as  string, t.Action);

             // Compute Label when Action changes
             else if (e.DomainProperty.Id ==  Transition.ActionDomainPropertyId)
                 t.Label = ComputeSummary(t.Event, t.Condition,  e.NewValue as string);

             // Compute Event, Condition, Action when Label changes
             else if (e.DomainProperty.Id ==  Transition.LabelDomainPropertyId)
                 ComputeProperties(e.NewValue as string, t);

         }

ComputeSummary是我们的辅助方法,通过Event,Condition,Action三个值来计算Lable的 值,ComputeProperties方法是由Lable的值来分别匹配出另外三个属性的值.最后可以直接对域类的属性进 入赋值. 这两个辅助方法就不在这里列出来了,在下载代码里可以看到.(在这里其实是默认提交,整个规则 事件就在一个事务中).

时间: 2024-10-31 15:21:13

Visual Studio DSL 入门 11---为状态机设计器添加规则的相关文章

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

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

Visual Studio DSL入门 10---完善状态机案例

完善 1.在运行的环境中,你会发现左侧工具箱中显示的选择项文本仍然是自动生成的LanagueSm,我们需要修改成StateMachine.打开 DslDefinition.dsl文件后打开Dsl Explorer,找到LanguageSm/Editor/Toolbox Tabs/LanguageSm结点,修改LanguageSm的属性里的Tab Text值为StateMachine 2.在运行环境中查看Transition的属性你会发现,所有的属性都属于杂项(Misc)分组,这是默认情况下生成的

Visual Studio DSL入门 8---创建状态机元数据模型

首先,按照第三节创建一个Minimal Lanauge模板项目,打开DslDefinition.dsl文件: 1. 把根域类ExampleModel的名称修改StateMachine.同时签入关系ExampleModelHasElements也会自动重命名为StateMachineHasElements. 2. 修改域关系StateMachineHasElements左侧的域角色Elements的属性名(Property Name 注意不是修改Name--域角色名)改成States.同时签入关系

Visual Studio DSL入门 9---创建状态机的图形符号

打开dsl文件后,关注泳道的右侧,首先我们来完成域类的形状表示: 1.一个状态State有进入操作和退出操作,所以我们为状态表示为隔间形状,可以在图上显示出来它的这两种操作(就象一个类包含方法和属性一样),先删除之前生成的ExampleShape.然后从工具箱中选择隔间形状(Compartment Shape)到Diagram Elements区域,命名为StateShape. 2.修改StateShape的一些属性,只是为了它显示起来更美观,修改Geometry属性为RoundedRectan

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 入门14---用Wix制作安装程序

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

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

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

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安装,下