使用 XML/XSD 和 T4 模板快速原型开发






4.97/5 (14投票s)
T4 模板内置支持 CRUD 操作,利用 XML/XSD 生成 DAL/BLL。
引言
可操作的原型对于向用户展示系统的运行视图非常有用,这有助于他们更好地理解系统,有时也是一种挖掘隐藏需求的技术。在我最近的一个项目中,我遇到了类似的情况,客户希望在签署规格列表之前看到系统的样子。因此,我设计了一个 T4 模板,该模板根据 XML/XSD 生成 BLL(业务逻辑层)/DAL(数据访问层),并在内存中执行 CRUD(创建/检索/更新/删除)操作。该模板可以根据个人需求轻松配置。
背景
原型的目的是允许软件用户通过实际尝试来评估开发人员对最终产品设计的提案,而不是仅仅根据描述来解释和评估设计。我采用的方法非常简单。T4 模板从 XSD 读取实体定义并相应地生成实体,然后从 XML 文件填充实体集合。过程如下面的图表所示。生成的类是部分类,因此我们可以扩展函数列表以满足我们的需求,而无需修改原始模板。
工作原理
T4 模板分两个简单步骤生成并填充 DAL 实体和 BLL 对象。首先,T4 模板需要知道实体的 DTO 和属性。这可以通过提供一个 XSD 来实现,我们可以在其中将实体属性和 DTO 定义为属性。正如您在下图中看到的,“User
”实体有七个属性。Name
包含属性名称,type
是对应属性的 DTO,而 use
指示它是否允许 null。
其次,T4 模板会查找 XML 数据来填充实体集合。如下图所示,每一行代表一个用户对象,每个用户节点的属性与 XSD 中指定的属性必须完全相同。
第三,生成模板的部分很容易。如下图所示,T4 模板会在预定义的位置查找 XSD,并且可以通过 web.config 配置 XML 数据的位置。
模板的作用是读取指定位置的 XSD,并根据模式配置 DataSet
。因此,XSD 中指定的元素有多少,就会在同一个 DataSet
下配置多少个 DataTable
。剩下的就很简单了;从 App_Data 中读取 XML 并加载到相应的 DataTable
。BLL/DAL 已准备好,并内置了基本的 CRUD 操作。利用 CRUD 功能构建原型。对于这个示例和附带的演示项目,我使用了一个对象数据源,它只需要最少的努力即可构建 UI。
此模板的设计考虑了以下几点:
- 内置对象数据源支持
- 内存操作
- 部分类
- 基本 CRUD 操作
- 搜索
- 单一父子表关系
使用代码
对于附带的演示项目,您无需进行任何配置,只需下载、解压、打开并运行解决方案即可。如果您想添加/编辑/删除新实体,您需要遵循一些规则。首先,在添加新实体的情况下,您必须在 XSD 中添加新元素,然后根据新添加的元素,您需要提供一个单独的 XML 数据文件。XML 文件名应该是复数形式,例如“Users”/“Contacts”/“Orders”,而不是“User”/“Contact”/“Order”等。对于编辑,请选择 XSD 中的现有元素之一,进行修改,并在相应的 XML 文件中进行相同的修改。在删除的情况下,首先从 XSD 中删除元素,然后删除 APP_Data 文件夹中相应的 XML 数据文件。最后,在解决方案资源管理器中点击“Transform All Templates”。
// XSD for User element
<xs:element name="User">
<xs:complexType>
<xs:attribute name="UserId" type="xs:int" use="required" />
<xs:attribute name="UserName" type="xs:string" use="required" />
<xs:attribute name="FirstName" type="xs:string" use="required" />
<xs:attribute name="LastName" type="xs:string" use="required" />
<xs:attribute name="MiddleName" type="xs:string" use="optional" />
<xs:attribute name="Email" type="xs:string" use="required" />
<xs:attribute name="Password" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
如果您想更改现有的 T4 模板,您需要对 T4 模板、关键字和使用的脚本有所了解。 这是一个非常有用的资源,我在使用 T4 模板时觉得很有帮助。
进一步的工作
提供的 T4 模板可以在以下方面进行进一步增强:
- 实体之间的多重关系
- 使用 T4 模板自动生成 UI
- 自动化基本单元测试用例
这些计划在后期版本中包含。我乐于接受任何关于改进模板的建议。
参考文献
谢谢
我要感谢 Mohammad Ashraful Alam 的最初想法和灵感。
历史
- QPro v1.0:基本版本,支持单一父子关系。