在我们创建领域模型前,我们有必要了解一下我们的模型用来表达什么内容。 所以我就先解释一下在这个系列文章中要实现应用。 假设Eclipse组织邀请你编写一个让他们管理贡献者和项目的应用程序。
我们需要创建一个模型来表达客户提供的信息。他们有可能如下图。
让我们进一步的看看这个模型。
-
Fundation
-
fundation是这个模型的根,他拥有两个列表属性。
projects: 像EMF,Techonlogy,Platform这样的顶级项目。 persons: 参加一个或多个项目的人。
Project
-
Eclipse项目拥有很多属性,比如项目开始和结束时间、项目的主页的url等等。下面列出我们最感兴趣的。
subprojects: 一个项目可以拥有多个子项目。子项目本身也可以拥有多个子项目。 parent: 项目有一个父亲(除了顶级项目外)。这就意味着项目和子项目(project-subproject)的关系是一个双向的关系。 projectleads 一个项目有多个项目领导人。 committers 一个项目可以拥有多个贡献者。
CommitterShip
-
当一个用户成为一个项目的贡献者(Committer)时,这就建立了一个committership。他拥有一个开始时间和结束时间。另外我们还要记录下下面的属性。
project: 和committership相关的项目。项目和committership是一个双向的关系。 person: 参加项目的人。
Person
-
贡献者或项目领导人的信息。我们关系的信息如下:
committerships: 用于保存和人相关的所有的committerships.这说明人和committership是一个双向关系。
下面这张类图给出了关于上面模型的全貌。
正如你所看到的,我把许多关系设成了双向关系。 As you noticed I modeled many of the relations as bidirectional relations. 这个并不是严格要求所有地方都要这样,因为有的地方可以通过eComtainer来获取他的父亲。就像project-subproject一样。 但是包含关系(containment relationship)在使用databinding的情况下就不太合适了。因为从子到父亲时没有对应feature,只能通过调用eContainer()方法来获得。 EMF提供了一个编辑器来创建你的Ecore-Model并把它保存成XMI格式。我们可以用它来创建测试数据。下图就是一个例子。