使用 Sculpture 进行模型驱动开发的介绍 - 第 1 部分





5.00/5 (23投票s)
本文将介绍如何使用 Sculpture 的模型驱动开发方法,通过您喜欢的技术(数据访问应用程序块、LINQ、NHibernate、ASMX 和 WCF)来创建和管理 .NET 企业应用程序。
引言
Sculpture 是什么?
- Sculpture 是一个开源的 .NET 模型驱动开发代码生成框架,非常适合创建和管理 .NET 企业应用程序。
- 使用 Sculpture,您可以对应用程序组件进行建模,然后将此模型转换为可部署的组件,以适应您喜欢的技术。
- Sculpture 提供了许多现成的“Molds”(“Molds”一词来自模具)插件,如 DAAB、NHibernate、LINQ、WCF、ASMX、SQL Server、MYSQL 等。
- Sculpture 包含一个指导包,用于构建您自己的 Mold 或定制现有 Mold。如果您有自定义的架构,可以使用此指导包,使用您喜欢的技术构建自定义代码生成器,以满足您的需求。
- Sculpture 可以使用模板生成任何类型的文本输出(源代码、数据库脚本、网页、XML、配置文件等)。
- Sculpture 提高了抽象级别;例如,模型中的数据访问层部分可以转换为 NHibernate 实现,只需稍作修改,就可以将其转换为 LINQ 实现,并且将来还可以转换为我们现在未知的“X”框架。
Sculpture 分为
- Sculpture Core Engine:这是一个托管 Molds 的平台,负责让所有 Molds协同工作。它包括模型设计器、Mold 发现和加载器、通用验证引擎、通用代码生成引擎、命令持有者和编辑器控件持有者。
- Mold:Sculpture 框架的主要插件。通过 Molds,您可以扩展 Sculpture 的所有功能,以根据您的需求管理模型和生成的代码。Molds 提供了处理模型元素的能力。
现成的 Molds
- 用于数据源层
- SQL Server
- 用于数据访问层
- DAAB(数据访问应用程序块)。
- NHibernate。
- LINQ to SQL。
- 用于服务层
- 服务库。
- ASMX(ASP.NET Web 服务)。
- WCF(Windows Communication Foundation)。
开始吧
在本篇文章中,我将向您展示如何使用 Sculpture 来创建和管理您的应用程序。我们将首先使用 LINQ 构建实体和数据访问层,然后使用 WCF 构建服务层。之后,我们将使用 NHibernate + ASMX Web 服务生成相同的模型。
目录
1. 设置您的项目
您需要做的第一件事是设置您的项目。
- 创建一个新的 Visual C# 类库项目,在“名称”字段中键入“Model”。在“解决方案名称”字段中键入“SculptureExample”,然后单击“确定”。此项目将托管模型。
- 为此解决方案添加两个类库项目,一个名为“Entities”,将托管业务实体,另一个名为“DataAccess”,将托管存储库类。
- 添加一个名为“WCFService”的 WCF 服务库,它将托管服务层。
- 添加一个名为“WCFHost”的 WCF 服务应用程序,它将作为 WCF 服务的宿主应用程序。
- 删除这些项目中未使用的文件;解决方案资源管理器应如下图所示。
2. 将 Sculpture 模型添加到您的应用程序
- 指向模型项目,然后右键单击“添加”->“新建项”;在模板列表中,选择“Sculpture Model”;在“名称”字段中,键入“MyFirstModel.Sculpture”。
- 现在,您的开发环境中已包含 Sculpture 模型。Sculpture 环境包含五个部分:
- Diagram Surface 托管模型元素。
- Toolbox 包含设计应用程序组件的可用工具。
- Sculpture Explorer 包含模型的所有元素,从实体到数据协定再到服务;您可以使用它轻松地在所有模型元素之间导航。
- Sculpture Properties 窗口包含模型元素的属性。
- Sculpture Details 窗口包含用于轻松创建和配置模型的编辑器控件。
3. 将 Molds 添加到您的模型
如前所述,Sculpture Core Engine 本身无法工作,您必须为其插入您喜欢的 Molds;我们将从添加以下 Molds 开始:
- Mold Base:是所有其他 Molds 的基础;它包含所有共享的通用属性和活动。所有 Molds 都必须直接或间接继承自它。
- SQL Server Mold:涉及与 Microsoft SQL Server 相关的所有活动。逆向工程引擎解析数据库并将其转换为模型,以便您可以从数据库开始项目。此外,数据库模式的任何更新都可以轻松地反映到模型中,而不会丢失任何元数据。逆向工程引擎支持从视图构建实体以生成 CRUD 存储过程脚本和数据库模式,这样您就可以从模型开始您的应用程序,设计您的实体,然后生成数据库脚本,以及 CRUD 存储过程脚本(如果需要)。
- LINQ Mold:此 Mold 生成 LINQ to SQL 实体和 Data Context,然后为每个实体生成存储库类,包含默认的数据访问方法(获取所有、按 ID 获取、查找、保存、更新和删除…)。
- Web Service Mold:此 Mold 不生成任何代码,它只收集子 Web 服务 Molds(ASMX、WCF)的通用属性;如果您想生成任何类型的 Web 服务(ASMX 或 WCF),则必须将此 Mold 包含在您的模型中。
- WCF Mold:此 Mold 生成 WCF 服务,它将 WCF 属性添加到数据协定、数据成员、数据集合、数据协定枚举、服务协定和类实现中。它为宿主项目生成一个 .SVC 文件和一个
web.config
文件。SVC 文件包含对服务实现的引用,以便您可以发布服务。它还在服务实现项目中生成一个app.config
文件,让您有机会使用 Microsoft WCF Test Client 测试您的服务。它包含一些特定于 WCF 的属性,如 Concurrency Mode、Instance Context Mode、Protection Level、Session Mode、End Point Name、End Point Binding Type 和 Services 的 End Point Address,以及 Operations 的 Async Pattern、Is Initiating、Is Terminating、Protection Level 和 Reply Action。
这些 Molds 中的每一个都包含
- 一个扩展名为“.Mold”的 XML 文件,其中包含 Mold 的整个结构。
- 一个 DLL 文件,其中包含与 Mold 关联的代码。
- 一个 Templates 文件夹,其中包含属于此 Mold 的 T4 模板。
要将 Molds 添加到您的模型,请在 Sculpture Details Window 中按“Molds Manager”按钮,然后通过选择“.mold”文件来添加您的 Molds。(您将在 Sculpture 安装目录中找到现成的 Molds。)Molds Manager 如下图所示,保存模型。不幸的是,您必须重新启动 Visual Studio,Molds 才能生效。
4. 设计模型
重新启动 Visual Studio 后,右键单击模型表面并按“Details”。您会注意到 Sculpture details window 中出现了一些按钮和编辑器。
在模型中我们需要做的第一件事是指定项目职责;这告诉 Sculpture 代码将在哪里生成,并设置值,如下图所示。(在此示例中,我们将数据协定、转换器、故障协定、服务协定和服务实现生成在一个项目中;但在实际应用程序中,您可能为每个指定一个项目)。
4-1. 设计实体
- 从工具箱中,您可以通过将实体及其关系拖放到模型表面来对其进行建模。
- 在本篇文章中,我们将使用 SQL Server Mold 支持的逆向工程工具从 Northwind 数据库生成实体及其关联。
- 单击模型表面以获取模型的属性。在 Sculpture Properties 窗口中,您会找到一个连接字符串属性,使用 Connection String Wizard 将其设置为 Northwind 数据库。
- 按 Sculpture 编辑器工具栏中的“Generate entities from SQL Server database”。
- 在 Database Object Selector Form 中,选择两个表(Categories 和 Products),然后按 Generate。
- 模型中出现了两个实体。
- 您可以通过选择关联并在 Sculpture Properties 窗口中按“participating properties”属性中的按钮来编辑关联关系,并选择关系元素,如下图所示。
- 如果您选择其中一个,您可以在 Sculpture Details 窗口的 Entity 选项卡中编辑其成员。
- 同样,在 Default Methods 选项卡中,您可以编辑数据访问默认方法。选择生成方法或不生成,选择方法的另一个名称,并为该方法键入注释。
- 除了默认方法,您还可以添加自定义数据访问方法并指定它们的返回类型和参数(自定义方法添加到数据访问类的接口)。
4-2. 设计数据协定
- 数据协定(有时称为“数据传输对象”或“值对象”)是将传播到更高级别(用户界面)的对象。
- 您可以从工具箱中将数据协定、数据集合、故障协定(用于 WCF)和数据协定枚举拖放到模型表面。
- Sculpture 提供了一个选项,可以自动从实体生成数据协定,而不是手动为每个实体创建数据协定。
- 按 Sculpture 编辑器工具栏中的“Generate data contracts from entities”。
- 您可以选择生成实体 – 数据协定转换器;这将生成一个静态类,可用于实体和数据协定之间的相互转换。
- 还有一个选项可以为生成的数据协定生成数据集合。
- 选择树中的所有实体,然后按 Generate。
- 您会在模型中找到新添加的数据协定和数据集合,实体与相应数据协定之间存在关系。
- 您可以通过选择关系并在 Sculpture Properties 窗口中按“mapping members”属性中的按钮来编辑属性之间的映射,并选择相应的成员,如下图所示。
- 如果您选择其中一个数据协定,您可以在 Sculpture Details 窗口的 Data Contract 选项卡中编辑其成员。
4-3. 设计服务
- 最后一步是设计您的服务;您可以简单地从工具箱中拖放一个服务,然后向该服务添加操作。
- Sculpture 提供了一个选项,可以自动从实体生成服务,而不是手动为每个实体创建一个服务,该服务包含默认和自定义数据访问方法。
- 按 Sculpture 编辑器工具栏中的“Generate services from entities”。
- 您会注意到每个实体都有其默认方法和自定义方法。
- 您还可以指定服务名称。
- 选择树中的所有实体,然后按 Generate。
- 您会发现模型中添加了新服务,并且实体与相应服务之间存在关系;这种关系意味着生成器将在该服务中定义存储库类的实例。
- 如果您选择其中一个服务操作,您可以在 Sculpture Details 窗口的 Operation 选项卡中编辑其参数。
4-4. 验证模型
- 既然您已经完成了设计阶段,就需要验证您的模型。Sculpture 提供了验证规则来处理模型中最常见的错误。如果您需要自定义验证规则,可以创建自己的 Mold,如第 2 部分所述。
- 您可以通过右键单击图表面并选择“Validate All”来验证您的模型;输出窗口应如下图所示。
5. 生成您的代码
现在是时候从我们的模型生成可部署的组件了。如前所述,我们从数据访问层的 LINQ Mold 和服务层的 WCF Mold 开始。
生成过程非常简单,只需右键单击图表面,然后单击“Generate”。Sculpture 将生成代码并将其附加到相应的项目。生成后,解决方案资源管理器应如下图所示。
让我们快速浏览一下生成的代码。
- Entities Project:包含附加了 LINQ 属性的实体,以及作为所有实体基础的“Entity Base”。
- Data Access Project:包含存储库类及其接口,以及“Repository Base”类和“Data Context”类。它还包含一个存储连接字符串的配置文件,以及一个引用此连接字符串的项目设置文件。此外,它还包含一个 SQL 文件夹,其中包含两个 SQL 文件,一个用于数据库模式,另一个用于 CRUD 存储过程。
- WCF Service Project:包含一个自定义文件夹用于转换器类。这些类可以直接用于实体和数据协定之间的转换,包含一个 DataContracts 文件夹,其中包含数据协定和数据集合,并包含服务实现和服务协定(服务协定 = 此服务实现类的接口),还包含一个包含 WCF 服务信息的配置文件。
- WCF Host Project:包含我们的 WCF 服务的 .SVC 文件;还包含一个包含这些服务信息的 Web 配置文件。
6. 测试您的应用程序
在测试应用程序之前,我们需要添加丢失的引用并添加自定义代码。
- 添加对这些项目的缺失引用。
- 在 Entities 项目中:添加对
System.Data.Linq
的引用。 - 在 Data Access 项目中:添加对 Entities 项目的引用,以及对
System.Data.Linq
的引用。 - 在 WCF Service 项目中:添加对 Entities 项目和 Data Access 项目的引用。
- 在 WCF Host 项目中:添加对 WCF Service 项目的引用。
- 添加自定义代码。在此示例中,我们将向
CategoriesService
中的 get-by-ID 操作添加实现。 - 在 WCF Service 项目的自定义文件夹中,添加一个名为“Services”的文件夹。
- 添加一个名为“CategoriesService.cs”的新类。
- 将以下代码添加到此类中。
namespace WCFService
{
public partial class CategoriesService
{
public override Categories GetById(int categoryid)
{
return CategoriesTranslator.ToDataContract(
categoriesRepository.GetById(categoryid));
}
}
}
现在是测试我们的项目的时候了,将 WCF Service 项目设置为启动项目并运行应用程序。
- 将 WCF Service 项目设置为启动项目。
- 构建并运行应用程序。
- 在 WCF 测试客户端中,调用
CategoriesService
中的 get-by-ID 操作,并享受结果。
7. 切换您的技术
正如我们前面提到的,模型驱动开发方法的主要优势之一是提高了抽象级别,因此您的问题与实现技术无关。在本节中,我将向您展示如何将实现技术从 LINQ 和 WCF 切换到 NHibernate 和 ASMX Web 服务。
- 从 Molds Manager 中,删除 LINQ 和 WCF Mold,然后添加 NHibernate 和 ASMX Mold。
- 重新启动您的 Visual Studio。
- 向解决方案添加一个名为“Service”的新 Class Library 项目。
- 向解决方案添加一个名为“WebService”的新 ASP.NET Web Service Application 项目。
- 删除最后添加的项目中的所有文件。
- 将我们在 WCF 服务项目中创建的
CategoriesService
复制到新的“Service”项目中(不要忘记将命名空间从“WCFService
”重命名为“Service
”)。 - 从解决方案中删除 WCF 服务项目和 WCF host 项目。
- 从 Entities 项目和 Data Access 项目中删除“Generated Code”文件夹。
- 返回模型,并在项目职责中,将 Service 项目指定为 WCF Service 项目的替代,并将 Web Service 项目指定为 WCF Host 项目的替代。
- 保存模型,您会注意到有关数据协定成员顺序的一些错误。您可以通过按 Sculpture details window 中的“Order Data Members”按钮来解决它,这将重新排序模型中的所有数据成员。
- 验证应用程序并确保没有错误,然后生成代码。
- 解决方案资源管理器应如下图所示。
- 在“mappings”文件夹中,选择所有 HBM 文件,并在其 Build Action 属性中选择“Embedded Resource”。
- 添加对这些项目的缺失引用。
- 在 Data Access 项目中:添加对 nhibernate.dll 和
System.Web
的引用。 - 在 Service 项目中:添加对 Entities 项目、Data Access 项目、
System.Web.Services
和System.EnterpriseServices
的引用。 - 在 Web Service 项目中:添加对 Service 项目和 NHibernate DLLs(log4net.dll、Iesi.Collections.dll、Castle.DynamicProxy.dll)的引用。
- 将“app.config”文件从 Service 项目移动到 Web Service 项目,并将其重命名为“web.config”,因为此文件包含 NHibernate 配置和连接字符串。
- 构建解决方案,然后在 Web Service 项目中右键单击“CategoriesService.asmx”,选择“在浏览器中查看”。
- 调用 '
GetById
' 操作,以看到与 LINQ+WCF 相同的结果,而无需编写任何额外的代码。 - 您可以尝试 LINQ+ASMX 或 NHibernate+WCF!!!
关注点
- 在此 Screencast 中查看本文。
- Sculpture 主页
- Sculpture 在线文档
结论
模型驱动开发代表了软件开发方法和实践的下一个逻辑步骤。它旨在促进从高层领域特定规范自动构建软件解决方案。这种方法旨在通过支持更高级别的抽象和领域特定资产的系统化重用,来提高生产力、可维护性、表达能力,并帮助管理复杂性。(来自:Model-Driven Development of .NET Enterprise Applications)。Sculpture (Model your Life) 是这一方向的新实现,可用于建模业务实体、数据协定和服务。基于此模型,Sculpture 将其转换为您喜欢的技术。Sculpture 是一个可插拔的引擎,因此您可以插入自定义代码生成器。