ECO传奇(II)
详细看看这个模型,它不但定义了类、方法和特性,更重要的是它详细地定义了一个实际的论坛系统中类之间的关系,因此,ECO执行时期就可以自动执行这些设计的关系,例如如果我们想要在一个论坛种类(程序设计)中加入两个论坛,那么就可以简单地使用下面的程序代码:
[C#]
Category aCategory = new Category(EcoSpace);
ACategory.Name = “程序设计”;
Forum aForum = new Forum(EcoSpace);
aForum.Name = “ASP.NET程序设计”;
aCategory.owns.add(aForum);
Forum aForum = new Forum(EcoSpace);
aForum.Name = “PHP程序设计”;
aCategory.owns.add(aForum);
[Delphi.NET]
aCategory := Category.Create(EcoSpace);
ACategory.Name := ‘程序设计’;
aForum := Forum.Create(Ecospace);
aForum.Name := ‘ASP.NET程序设计’;
aCategory.owns.add(aForum);
Forum aForum := Forum.Crrate(EcoSpace);
aForum.Name = ‘PHP程序设计’;
aCategory.owns.add(aForum);
之所以会这么简单是因为模型中已经定义了Category和Forum这两个类之间有一对多的关系,而且这两边的关系使用了ownedBy和owns来定义,因此,在程序代码中我们就可以直接使用定义的关系,ECO执行时期由于是执行定义的模型,因此能够了解这些程序代码的意义。这样一来,开发人员只需要遵照模型的定义就可以专心地撰写程序代码,ECO把类之间不管是一对一,一对多,多对多的关系都自动产生了相关的程序代码,开发人员不再需要分心自行建立或是使用额外的数据结构,例如ArrayList或是Collection等。
那么如何把上面程序代码的异动更新回数据库中? 这是非常简单的,因为ECO提供了强大的OR Mapping技术,一旦模型定义完成之后,ECO能够自动地根据模型而执行MDD中的模型转换(Model Transformation)规范而把模型转换为数据库模式。开发人员可以选择要使用的数据库是什么,要使用的数据存取技术是什么,ECO便会自动根据开发人员的设定完成。这个流程就避免前面本文所叙述的开发人员需要不断地在不同的项目中撰写重复的数据存取程序代码。
目前ECO支持了市面上主流的数据库,例如Oracle,MS SQL Server,InterBase,DB2,MySQL和Sybase等。支持的数据存取技术则有ADO.NET和Bdp.NET。下面的图形说明了这个概念。
因此,通过ECO提供的OR Mapping功能,每一个ECO类对象就是一个可永续储存的对象,因此我们就可以使用下面更为简单的程序代码完成储存上面程序代码异动的工作:
[C#]
EcoSpace.UpdateDatabase();
[Delphi.NET]
EcoSpace.UpdateDatabase;
一旦调用了EcoSpace的UpdateDatabse方法,ECO在执行时期就可以自动侦测已经被异动过的对象,然后通过ECO的永续储存服务接口执行OR Mapping的工作把异动的对象储存在数据库中。这样一来,开发人员再也不需要花费时间重复的撰写数据存取程序代码来存取各种不同的数据库,这又避免了前述的开发问题之一。
那么ECO的对象样例如何和.NET的图形用户界面组件在一起使用呢?这个意思是说ECO可以把业务逻辑对象当成是一般的.NET对象(DataSet)进而显示在.NET组件中吗? 当然可以,ECO使用了Adapter技术,让ECO业务逻辑对象可以通过ECO提供的Handler组件和.NET的图形用户界面组件绑定在一起。例如在下图中笔者使用了ECO的Handler组件(ehForumSite)通过OR Mapping从数据库中抽取业务逻辑对象,再直接和.NET内定的ASP.NET Web组件绑定在一起,这样一来,这些被选择的业务逻辑对象在ECO ASP.NET应用程序执行时就会自动显示在浏览器中,就好像是开发人员自己撰写ADO.NET程序代码从数据库中选择数据,建立DataSet对象,再显示于Web组件中一样,但是使用ECO,开发人员可以完全省略重复撰写这些相同程序代码的时间。
当然ECO除了可以绑定ASP.NET的Web组件之外,也可以使用于Winform的应用程序中,相同的业务逻辑模型可以重复使用在ASP.NET,Winform,Web Service和WinCE的应用程序中,大幅节省重复开发的成本。例如下图就是使用前面相同的模型于另外一个Winform项目中执行的画面:
也许现在读者会有一个疑问,那就是前面叙述的ECO的Handler组件(ehForumSite)如何从数据库中抽取应用程序需要的对象呢? 是使用SQL吗? 可是SQL执行的结果应该是数据集(Data Set),怎么会是对象呢?
如果读者有这个疑问的话,那非常好,这代表读者询问到了ECO的一个核心问题,那就是如何从数据库中选择ECO应用程序需要的对象? 答案就是ECO使用MDD的标准规范OCL(Object Constraint Language)语言来执行选择对象的工作。OCL是OMG定义的标准,也是MDD的子规范之一,OCL可以使用在模型中定义业务逻辑,因为OCL定义了许多的操作数,OCL也可以使用于选择对象,提供类似于SQL的能力。只是SQL选择的结果是数据集,而OCL执行的结果则是对象或是对象集。
例如前面的ehForumSite组件即使用了下面的OCL从数据库中选择出所有的论坛网站对象:
ForumSite.allInstances
当然,OCL也定义了丰富的选择操作数让开发人员使用更精确的条件来抽取对象,例如我们可以使用下面的OCL选择出所有论坛种类中包含多于一个论坛主题的论坛种类对象:
Category.allInstances->select(c| c.owns.size() <> 0)
OCL也允许使用巢状或是串联的语法,例如下面的OCL可以抽取出所有有QA问题但是尚未回答的研讨会对象:
DevCoSeminar.allInstances.select(s | (s.hasQA.size() > 0) and (s.hasQA.select(not closed)->size() > 0) )
由此上面简单的叙述可