XEML (实体标记语言) 用于代码生成






3.35/5 (9投票s)
XEML (实体标记语言) 用于代码生成
引言
多年来,从模型生成完整代码一直是行业目标。模型驱动架构方法提供了一套建模表示法,大部分基于UML,用于以平台无关的方式指定系统不同层,即用户界面、业务逻辑和数据库。然后,一组代码生成器将这些模型转换为平台特定的实现。
用于代码生成的两个最流行的模型是
- UML 用于程序建模,是OMG模型驱动架构(MDA)的一部分
- 领域特定语言(DSLs),为特定问题领域创建的小语言。
UML模型通常是基于MDA的开发方法的基础。UML被设计和指定为面向对象软件系统的通用建模语言。UML具有几个普遍的优势。它是最广为人知的面向对象建模表示法,它拥有易于理解的图形表示法,以及一套丰富的标准,用于捕捉OO系统的关键特性。
DSM(领域特定模型)是建模和代码生成的替代方法。领域特定建模将抽象级别提高到编程之上,直接使用领域概念指定解决方案。然后,最终的软件产品从这些高级规范中生成。这是通过DSL(领域特定语言)实现的,DSL遵循领域抽象语义,允许开发人员专注于解决方案而不是解决方案的技术实现。
统一建模语言或领域特定建模语言?建模方法论者之间正有一场战争。这两种方法都不是完美的。UML基于代码世界,仅能提供适度的可能性来提高设计抽象级别和实现完全代码生成。UML侧重于代码的可视化,因此与C#或Java代码相比,在整体生产力上无法取得显著的提高。使用DSM,您需要创建更复杂的DSLs和生成器,并且DSLs需要不断演进。这创造了一种新的复杂性,而不同的DSLs和生成器使得软件开发的标准化变得非常困难,如果不是不可能的话。在自动化中使用模型取决于高质量的DSLs,如果关键问题领域没有免费或廉价的标准DSLs,模型自动化将不会发生。为组织开发所有必需的DSLs对于预算有限的公司来说并不吸引人。
XEML – 实体标记语言
我们提出了一种名为XEML的通用建模语言,一种基于XML的、用于商业应用程序的实体标记语言。XML是一种元语言,可用于开发通用建模语言。它是一种表示模型并实现模型与业务软件分离的合理语言。XML受到所有主要IT供应商和用户群的热情拥抱。其标准化和快速普及是过去十年IT领域的主要发展。IBM、Microsoft、SUN和Oracle等行业竞争对手都支持核心XML标准,并正在基于它开发主要产品,并合作开发相关标准。XML通过以下方式为声明式建模提供了支持:
- 其标准化和快速普及简化了标准开发流程。
- 有大量专门用于处理XML的软件工具和API。
- XML是基于文本的(因此是平台无关的)。
- XML是可扩展的,允许对底层数据进行更有意义的描述。
由于XEML模型实际上是XML文档,XSLT模板用于创建不同的代码生成器。使用XSLT,您可以脚本化访问XML DOM,XSLT处理器解析XML文档以构建DOM,XSLT脚本操作DOM输入以构建DOM输出。可以从DOM输出构建纯文本源代码文件。纯文本输出形成一个或多个源文件。
使用XSL样式表将XEML模型转换为代码的另一个重要优势是XSL是一种声明式语言。XSL是声明式(与过程式相比),因为它描述了转换的结果而不是执行它的步骤。这提供了更高层次的抽象。这些事实使得源代码生成任务变得异常简单,因为解析、验证和生成代码的任务都可以通过易于获取的工具以快速脚本化开发的方式完成。
与其他任何标记语言一样,XML标签和属性用于定义XEML模型。在XEML中,模型称为实体,实体的组件称为属性,对其他模型的引用称为关系,并且为数据库系统定义了键(主键和外键)。本节概述了最常用的XEML标签。
Schema 标签
SCHEMA 是 XEML 文件的最外层容器。Schema 是为业务应用程序创建的模型。它定义了模型的通用和全局信息。
<schema name="Order System" owner="Sales">
Entity 标签
ENTITY 是业务应用程序中的一个对象,它封装了指定的数据。例如,实体模型可用于描绘公司的客户群。客户实体具有诸如姓名、联系方式和地址等属性,以及与其他实体(如订单)的关系。理论上,如果系统的一部分可以被识别,那么系统就可以表示为实体模型。本质上,XML中定义的实体在面向对象的应用程序系统中成为类,或在数据库中成为表。
<entity name="Customers" tableschema="dbo">
Attribute 标签
ATTRIBUTE 代表包含数据的结构。ATTRIBUTE 标签定义了数据库实体字段或应用程序对象属性。实体的属性可以是一个简单值,例如标量(例如,字符串、整数或十进制),也可以是 BLOB(例如,二进制),或日期和时间(例如,日期或时间戳)。
<attribute name="CompanyName" type="string" />
Key 标签
PRIMARY KEY 用于唯一标识数据库表中的每条记录。它由一个或多个实体属性组成。
<pkey name="PK_Customers">
<key name="CustomerID" />
</pkey>
FOREIGN KEY 是对另一个数据库表中的 PRIMARY KEY 的引用。外键由一个或多个实体属性组成,这些属性引用其他表中的字段。
<fkey name="FK_Orders_Customers">
<key name="CustomerID" parent="Customer" />
</fkey>
Relationship 标签
在面向对象的应用程序中,并非模型的所有属性都是属性,您的应用程序通常由多个类建模。在运行时,您的对象模型是由构成对象图的关联对象集合。这些模型对象之间的关系可以在运行时遍历以访问相关对象的属性。
<relationship source="Customer" target="Order" type="1..*" />
然后生成一个规范和多个源文件。可以从这些 XEML 实体模型生成的一些工件包括
- UI 组件
- C#、Java、PHP 或任何您喜欢的语言中的领域对象
- 数据库 DDL 和过程
- Word 或 HTML 格式的 Schema 报告
- 实体关系和 UML 类图
工作原理
代码生成逻辑的核心处理步骤是树遍历。任何 XML 文档的结构都像一棵树,节点具有名称、文本值、命名属性和子节点。我们甚至可以使用我们构建的工具(LatticeFramework Studio)从数据库生成 XEML 模型;在这里,我们只是手动创建 XEML 模型来描述客户实体。
<entity name="Customer">
<attributes>
<attribute name="CustomerID" type="string" length="5" />
<attribute name="CompanyName" type="string" length="40" />
<attribute name="ContactName" type="string" length="30" />
<attribute name="ContactTitle" type="string" length="30" />
<attribute name="Address" type="string" length="60" />
<attribute name="City" type="string" length="15" />
<attribute name="Region" type="string" length="15" />
<attribute name="PostalCode" type="string" length="10" />
<attribute name="Country" type="string" length="15" />
<attribute name="Phone" type="string" length="24" />
<attribute name="Fax" type="string" length="24" />
</attributes>
<keys>
<pkey name="PK_Customers">
<key name="CustomerID"/>
</pkey>
</keys>
</entity>
XSLT 样式表由一组规则组成,这些规则决定如何处理 XML 文档中的特定元素。每条规则都有匹配条件,指定规则激活的元素模式。每条规则还有一个关联的转换,作用于匹配的元素。规则是分层组成的,因为每条规则都可以通过使用
以下 XSL 标签最常用
<xsl:value-of>
:用于从 XML 文档中选择元素的值<xsl:if>
:XSL 中if
-then
-else
和switch
控制结构的对应项<xsl:for-each>
:遍历 XML 元素集合<xsl:text>
:用于指定自定义文本<xsl:include>
:将一个样式表的内容包含到另一个样式表中
应用 XSL 样式表到 XML 文档需要一个 XSL 处理器。XSL 处理器读取 XML 文档和 XSL 样式表,然后将样式表中的一组转换规则应用于 XML 文档,以生成所需的输出。
从 XEML 模型生成存储过程和业务对象非常简单。下面,我将向您展示如何从 XEML 模型生成 Microsoft Word 格式的数据库 Schema 报告以及 PDF 格式的实体关系图。
生成 Word 格式的数据库 Schema 报告
Word 2003 中的 XML 支持是一项令人兴奋的新功能。Word 2003 现在支持称为 Word Markup Language (WordML) 的原生 XML 词汇表。最简单的 WordprocessingML 文档只包含五个元素(和一个命名空间)。这五个元素是
- WordDocument 元素:
WordprocessingML
文档的根元素 - body 元素:显示文本的容器
- p 元素:一个段落
- r 元素:具有一致属性的连续的
WordprocessingML
组件集 - t 元素:一段文本
根 WordprocessingML Schema(也称为 XML Document 2003 Schema)的命名空间是 "http://schemas.microsoft.com/office/word/2003/wordml"。此命名空间通常通过使用前缀“w”与 WordprocessingML 元素关联。最简单的 WordprocessingML 文档如下所示
<?xml version="1.0"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<w:body>
<w:p>
<w:r>
<w:t>Hello, World.
</w:r>
</w:p>
</w:body>
</w:wordDocument>
我们可以编写一个 XSLT 样式表来将 XEML 模型转换为 WordML。下面的示例演示了如何从 XEML 模型生成表列表。
<xsl:for-each select="entities/entity">
<w:p>
<w:r>
<w:rPr>
<w:b w:val="on"/>
<w:color w:val="6495ed" />
</w:rPr>
<w:t>
<xsl:value-of select="@name"/>
</w:t>
</w:r>
</w:p>
</xsl:for-each>
生成 PDF 格式的实体关系图
Graphviz 是 AT&T 研究实验室发起的一组开源工具,用于绘制用 DOT 语言脚本指定的图形。Graphviz 包括一种名为 DOT 语言的图形描述语言和一套可以生成/或处理 DOT 文件的工具。DOT 是一种纯文本图形描述语言。它是一种简单的方式来描述图,人类和计算机程序都可以使用。
编写 XSLT 样式表将 XEML 模型转换为 DOT 文件并使用 GraphViz 工具生成 PDF 格式的 ER 图非常容易。
digraph G {
fontsize = 6;
fontname = "Tahoma";
node [shape = "record", style = "filled"];
edge [arrowhead = "none" fontsize = 6];
"Customer" [
fillcolor = "lightblue";
label = <
<table>
<tr><td>Customer</td></tr>
<tr>
<td align="left"> + CustomerID</td>
<td align="left"> : integer</td>
</tr><tr>
<td align="left"> + Name</td>
<td align="left"> : string</td>
</tr><tr>
<td align="left"> + Address</td>
<td align="left"> : string</td>
</tr><tr>
<td align="left"> + Phone</td>
<td align="left"> : string</td>
</tr>
</table>
>;
];
"Customer" -> "Order" [taillabel="1", headlabel=" 0..*"];
}
生成 ASP.NET MVC + 实体框架应用程序
基于 XEML 模型,可以生成 ASP.NET MVC 视图和控制器以及用于创建表的 SQL DDL 脚本。
生成的视图
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true"
CodeBehind="Customer.aspx.cs" Inherits="Test.Views.Customer.Customer" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<!--
//
// Entity: Customer
// Author: Julie
// Date: Thursday, February 12, 2009
// Time: 9:48:17 AM
//
// Web: http://www.latticesoft.com
// Email: studio@latticesoft.com
//
// The code was generated by LatticeFramework Studio
// Copyright © 2008 Lattice Business Software.
// All Rights Reserved.
//
-->
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
The code was generated by LatticeFramework Studio.
</p>
<p>
To learn more about LatticeFramework Studio visit
<a href="http://www.latticesoft.com" title="LatticeFramework Studio Website">
http://www.latticesoft.com</a>.
</p>
<h2>Customer List</h2>
<table>
<tr>
<th>Customer ID</th>
<th>Name</th>
</tr>
<%foreach (var c in ViewData.Model ){ %>
<tr>
<td><%= c.CustomerID %></td>
<td><%= c.Name %></td>
</tr>
<% } %>
</table>
</asp:Content>
生成的控制器
#region CustomerController.cs -- Copyright © 2009 Lattice Business Software
//-----------------------------------------------------------------------------------
//
// Class: CustomerController.cs
// Author: Julie
// Date: Friday, February 13, 2009
// Time: 9:47:57 AM
//
// Web: http://www.latticesoft.com
// Email: studio@latticesoft.com
//
// The code was generated by LatticeFramework Studio
// Copyright © 2008 Lattice Business Software.
// All Rights Reserved.
//
//------------------------------------------------------------------------------------
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Test.Models;
namespace Test.Controllers
{
public class CustomerController : Controller
{
TestEntities db = new TestEntities();
public ActionResult Index()
{
ViewData["Title"] = "Customer Page";
ViewData["Message"] = "Welcome to LatticeFramework Studio!";
return View();
}
public ActionResult Customer()
{
List list = db.Customer.ToList();
return View(list);
}
}
}
生成的创建示例表的 DDL
CREATE TABLE [dbo].[Customer] (
[CustomerID] [int] NOT NULL,
[Name] [varchar](100) NOT NULL
) ON [PRIMARY]
ALTER TABLE [dbo].[Customer] WITH NOCHECK ADD
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
[CustomerID]
) ON [PRIMARY]
关注点
模型驱动架构的核心是模型。模型将抽象级别提高到编程之上,直接使用领域概念指定解决方案。用于代码生成的两个最流行的模型是 UML 和领域特定模型 (DSM)。UML 还是 DSM?建模方法论者之间正有一场战争。两种方法都不是完美的。我们能取长补短吗?我们提倡结合这两种方法。在本文中,我们介绍了 XEML(实体标记语言),用于在领域特定世界中使用通用建模语言来自动化软件开发。
历史
- 2008年8月25日
- 首次发布
- 2009年1月12日
- 更新了生成 ASP.NET MVC + 实体框架应用程序
- 上传了完整的 VS 2008 项目