使用 Hera Application Framework 创建数据驱动的应用程序





5.00/5 (1投票)
2006 年 12 月 21 日
9分钟阅读

64769
Hera Application Framework 如何帮助您开发数据驱动型应用程序的简要概述。
这是我们 CodeProject 赞助商的产品展示评测。这些评测旨在为您提供我们认为对开发者有用且有价值的产品和服务信息。
引言
Hera Application Framework 是一个强大的对象持久化框架,旨在帮助您开发数据驱动型应用程序。它使您免于编写耗时的数据转换过程,该过程需要在数据源和面向对象的业务模型之间进行。此功能将根据数据源和定义两者之间关系的映射,在运行时自动添加到您的 .NET 类中。通过在运行时执行此操作,框架可以确定实现此功能的最佳方式,从而保证更高的性能。它还使您能够使用不同的数据源,或者更改映射而无需重新编译代码。
主要功能
- 数据源独立
- 对象查询语言
- 自动状态管理
- 延迟加载
- 事务管理
- 并发处理
- 强类型查询
- 存储过程映射
- 用户类型
- 缓存
选择数据源
通过使用 Hera Application Framework,您可以自由选择各种可能的数据源。该框架附带两个完全支持的关系数据库数据处理程序,分别是 Microsoft SQL Server 和 Oracle。在框架中,这些数据处理程序被称为网关。您通常会为项目中使用的每个网关设置一个映射。这允许您在映射中定义数据库特定功能,而不是在代码中定义,从而使您的代码更独立于数据源。例如,Microsoft SQL Server 中的标识列与 Oracle 数据库中的序列的使用。
与市场上大多数对象关系框架不同,Hera Application Framework 不限制您只能使用关系数据库作为数据源。该框架的设计方式使我们能够实现一种完全不同的网关,该网关允许您将业务模型映射到 XML。这使您能够以与处理关系数据库数据完全相同的方式处理 XML 数据,使您的代码更加一致。这也使我们能够向框架添加一项非常独特的功能,如本文后面将介绍的。
入门
创建业务模型和数据源之间的映射有两种方法。您可以手动编写映射文件,也可以使用我们随默认应用程序框架安装一起提供的 Configurator 工具。Configurator 使用您选择的数据库来存储项目的设置。您需要定义这些设置的位置;有关更多信息,请参阅文档。
让我们通过一个示例,了解如何使用 Configurator 创建一个面向对象的业务模型,并以 Microsoft SQL Server 作为数据源。在此示例中,我们假设您有一个名为 Departments 的表,其结构如下:
CREATE TABLE Departments
(
DepartmentID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Name VARCHAR(255) NOT NULL UNIQUE
)
在阅读完文档中的“入门”部分设置 Configurator 后,您可以开始创建一个新项目。
Configurator 将查询数据库中所有可以映射到 .NET 类的表。单击“添加类”按钮会弹出一个向导,引导您完成必要的步骤。
选择表后,Configurator 会显示所有列的列表,并建议一个属性名称和类型来表示它们在 .NET 类中。您可以根据需要更改这些属性的名称及其类型。
向导的下一步将允许您更改类的名称、程序集或命名空间。您还可以为生成的类选择基类。这可以是一个您创建的通用对象,用于进一步增强业务对象的 a功能。
现在 Configurator 已了解您的第一个类,您可以生成代码并开始开发应用程序。转到“工具”->“全部生成代码”以执行此操作。生成的文件夹将如下所示:
您将拥有项目的基本文件夹、一个示例 App.config(可以轻松用作 web.config)、两个用于生成的 Department
类的文件、映射文件和一个 C# 项目。
Configurator 为 Department
创建了两个文件,这是由于生成项目的方式。您永远不应更改 DepartmentGenerated.cs 文件中的代码,因为如果重新生成,该文件将被覆盖。请记住,这不是限制;这是我们在使用 Configurator 生成代码时做出的设计选择,如果您选择手动创建映射文件,则不受任何约束。
现在我们有了基本项目,可以开始使用它来查询 SQL Server 数据库中的数据。
查询数据
虽然您通常会编写 SQL 来查询数据,但现在您可以利用 Hera Application Framework 内置的查询语言。但是,在开始查询之前,您需要创建一个会话。会话基本上是您与数据源通信的范围。
using (Session session = Session.CreateSession())
{
Query query = session.CreateQuery(“from Department”);
DataList<Department> departments = query.List<Department>();
}
此处创建的会话将使用 App.config 文件中指定的默认网关与数据源进行通信。您也可以指定其他网关。这允许您同时处理多个数据源。使用此会话,我们可以通过发出对象查询语言 (OQL) 表达式来创建查询。在这种情况下,我们查询数据库中的所有部门记录。调用此 Query
对象上的泛型 List
方法会将 OQL 表达式转换为 SQL 并针对数据库执行。
关系数据
当然,并非所有数据都像这样简单。事实上,很难找到一个数据库表中不与其他表存在某种关系的表。Hera Application Framework 完全支持一对一、一对多、多对一和多对多关系,包括级联操作。
假设您还有一张名为 Employees 的表,定义如下:
CREATE TABLE Employees
(
EmployeeID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
FirstName VARCHAR(255) NOT NULL,
LastName VARCHAR(255) NOT NULL,
DepartmentID INT NOT NULL REFERENCES Departments
)
返回 Configurator 以创建基于此表的新 .NET 类时,向导会向您展示一个额外的步骤。
单击此处的“查找全部”按钮将自动发现以某种方式引用此表的所有关系。
Configurator 检测到员工与其部门之间存在多对一关系。您随时可以添加或编辑关系。在这种情况下,您可以编辑 Department
类的关系,以添加与 Employee
的一对多关系。重新生成代码后,您将在 Employee
上拥有一个 Department
类型的属性。
Employee emp = session.Load<Employee>(10);
Console.WriteLine(emp.Department.Name);
上述示例将通过传递主键来查询数据库中的一个 Employee
。接下来,我们访问 Employee
的 Department
属性,并将其名称写入屏幕。如您所见,我们无需编写任何代码即可查询此 Department
,因为只要会话仍然有效,框架就会在您访问属性时自动完成此操作。这称为延迟加载,可确保您仅查询实际使用的内容。
使用 OQL 处理关系数据非常简单,如下例所示:
// Query all departments having more than 5 employees
string query = "from Department d where d.Employees.Count > 5";
您甚至可以将参数设置为另一个映射类型的值。然后,框架将自动确定它们之间的关系定义,并向 SQL 表达式添加正确的条件。
Department dept = session.Load<Department>(1);
Query query = session.CreateQuery("from Employees" +
" e where e.Department = {Department}");
query.SetParameter("Department", dept);
DataList<Employee> employees = query.List<Employee>();
框架还可以为您处理逆向关系。您可以在映射中定义是否需要此行为。
Department dept = session.Load<Department>(1);
Employee emp = session.CreateInstance<Employee>();
emp.Department = dept;
// dept.Employees automatically contains the new Employee
Assert.IsTrue(dept.Employees.Contains(emp));
返回值
每当对象的属性值由数据源决定时(例如,使用标识符或序列),该值将自动返回,并且与该列对应的属性将自动更新。
Employee emp = session.CreateInstance<Employee>();
emp.Name = "Garfield";
session.Save(emp);
Assert.NotNull(emp.Id);
您还可以将其他属性定义为返回值属性,例如,当表包含一个由数据库触发器自动设置的 last-modified 列时。
用户类型
Hera Application Framework 还支持用户类型来分组列。映射用户类型中的属性就像映射对象本身的属性一样简单。
Employee emp = session.Load<Employee>(10);
Console.WriteLine(emp.Audit.CreationDate);
Console.WriteLine(emp.Audit.CreatedBy);
Console.WriteLine(emp.Audit.LastModifiedDate);
Console.WriteLine(emp.Audit.LastModifiedBy);
强类型查询
在 SQL 用于与数据库通信的应用程序中,一个常见问题是在设置参数时缺乏类型检查。在 Hera Application Framework 中,我们通过添加对强类型查询的支持来解决了这个问题。通过定义一个强类型查询类并在整个应用程序中使用它,您可以确保查询表达式中的参数值始终是正确的类型。这进一步消除了在提供错误值类型时可能发生的运行时错误。您甚至可以向这些属性添加参数验证逻辑,以便在客户端就可以检测到错误的值,而不是让数据库通过错误通知您。这些类必须继承自框架中的 NamedQueryBase
类,并且必须在映射中定义。
使用 Configurator 也可以轻松创建命名查询,如本屏幕所示。您可以输入的查询可以是原生 SQL 查询或 OQL 表达式。
生成代码后,您的项目中会有一个名为 DepartmentByName
的新类。使用以下代码,您可以将部门从数据库中查询出来,并提供一个名称作为参数。
DepartmentByName deptQuery =
session.CreateNamedQuery<DepartmentByName>();
// Entering a wrong value type for name
// here will result in a compile-time error.
deptQuery.Name = "Sales";
Department dept = query.Load<Department>();
Microsoft Exchange SDK
正如本文开头所述,通过实现 XML 网关,我们可以创建一项非常独特的功能。Hera Application Framework 捆绑了用于处理 Microsoft Exchange 2000/2003/2007 的 SDK。该 SDK 完全基于框架本身构建。与 Exchange 服务器的通信通过 WebDAV 建立。通过将与服务器的 XML 通信映射到用户友好的业务模型,现在比以往任何时候都更容易将 Exchange 集成到您的应用程序中。
using (ExchangeServer server = new ExchangeServer())
{
server.Location = "MyExchangeServer";
server.Credential = new NetworkCredential("UserName", "Password");
// Create a note
Note note = server.CreateNote();
note.Subject = "My Own Note";
note.TextDescription = "This is a test note.";
if(File.Exists(@"c:\logs.txt"))
{
note.AddAttachment(@"c:\logs.txt");
}
server.Save(note);
// Create an appointment
Appointment appointment = server.CreateAppointment();
appointment.Subject = "My Appointment";
appointment.HtmlDescription =
"<font color=red>Test</font> <i>appointment</i>.";
appointment.StartTime = DateTime.Now.AddHours(2);
appointment.EndTime = DateTime.Now.AddHours(4);
server.Save(appointment);
// List all contacts
foreach(Contact contact in server.Contacts)
{
Console.WriteLine(contact.Name);
}
}
许可证
Hera Application Framework 被许可为免费供非商业用途使用。一旦您开始构建基于我们框架的程序并计划将其部署到生产环境,您将需要购买服务合同。签署服务合同允许您在我们服务台应用程序中发布工单,并使您能够访问我们的安全论坛。有关更多信息,请访问我们的网站。