工具箱

在活动的记录模式纵横面向的编程

Scott Mitchell

所有价格在 12 月 29 日 2008 确认,并有可能变动。 以此列的意见那些仅作者的并执行不一定反映 Microsoft 意见。

内容

在.NET 应用程序中实现 Active 记录模式
.NET Framework 中的、 面向方面的编程

在.NET 应用程序中实现 Active 记录模式

活动记录模式通常用于数据驱动应用程序中的模型数据库表或视图的类,以其模型数据库表的一行由类的实例。 在这种模式类的属性将映射到相应的数据库表的列中。

类的实例方法上执行操作在数据库记录而其静态方法使用整个表。 是例如如果数据库包含一个名为列 EmployeeId uniqueidentifier、 作为一个 nvarchar(50) 的名称和作为一个货币的薪水的雇员的表,实现活动记录模式您想创建一个名为类 Employee 具有名为 EmployeeId、 名称和薪水的属性。 在员工类将包括实例方法如创建,保存,和删除,并可能包括如 DeleteAll、 查找和 FindAll 的静态方法。

图 1 显示了活动记录模式。 它提供了一个简单、 直观语法使用数据并使用多个对象关系 mappers (O / RM) 模式。

图 1 中的活动记录模式

// Add Andrew Fuller as a new employee  
Employee emp = new Employee();
emp.Name = "Andrew Fuller";
emp.Salary = 50000.00M;
emp.Create();

// Give a 10% raise to all employees 
Employee[] allEmployees = Employee.FindAll();
foreach (Employee current in allEmployees)
{
    current.Salary *= 1.10M;
    current.Save();
} 

城墙 ActiveRecord (版本 1.0,RC3) 项目提供快速简便的方式实现 Microsoft 基于.NET Framework 的应用程序的活动的记录模式。 它的之上 NHibernate,它是一个免费的开源的 O / RM 工具,并已评审, 2006 年 10 月工具箱列.

NHibernate 的缺点之一是它有一段陡的学习曲线,并要求开发人员可以创建和维护将联系在一起在数据库表、 列和与类和属性的关系在应用程序中的 XML 映射文件。 ActiveRecord 项目 API 通过使用.NET 属性封装大部分这种复杂性,并使实现简单的活动记录模式。

要开始,请从项目的主页下载安装程序包。 这将 ActiveRecord 和 NHibernate 程序集安装并使其对 Visual Studio 可见 ; 将这些程序集添加到项目。 接下来,创建在应用程序,将使用该活动记录模式模型数据库表中的类。

这是员工类中引用的代码 图 1 :

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    [PrimaryKey] public Guid EmployeeId { get; set; }
    [Property] public string Name { get; set; }
    [Property] public decimal Salary { get; set; }
}

请注意在员工类扩展 ActiveRecordBase 类,并使用属性标记的属性映射到数据库表中的列,并哪一列作为主键。 ActiveRecordBase 该类定义的实例方法如创建和保存和包括 Find、 FindAll 和 DeleteAll 的静态方法。

您可以通过传递通过 PrimaryKey 和属性的属性,包括字符串的长度参数中的列、 列是否在列可以分配一个数据库 NULL 值如果需要唯一的值和是否忽略当插入或更新一个类实例的列提供有关员工类中的每个成员更多详细信息。

一起创建员工类,还需要定义如数据库连接字符串和 NHibernate 特定选项的少量的几个配置设置。 但是,还有无需编写任何数据访问代码。 处理为您自动将 ActiveRecord 项目和 NHibernate。 实际上,您甚至无需此时已创建数据库表,如 ActiveRecord 项目可以自动为您基于您创建的类中生成表。

ActiveRecord 项目的属性语法还用于建立类之间的关系。 是例如 HasMany 和 BelongsTo 属性用于在父和子类中分别,指示的一对多关系。 假设的数据模型已扩展,以建立部门和雇员之间的一对多关系在员工表中包含部门表列 DepartmentId 名称和 DepartmentId 列。 这种关系将建模应用程序中通过添加一个部门类,并更新员工类包括一个新的属性 (参见 图 2 )。

图 2 添加 Employee 类

[ActiveRecord]
public class Department : ActiveRecordBase<Department>
{
    [PrimaryKey] public int DepartmentId { get; set; }
    [Property] public string Name { get; set; }
    [HasMany(typeof(Employee))] public IList Employees { get; set; }
}

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    ...
    [BelongsTo("DepartmentId")] public Department Department { get; set; }
}

请注意部门该类具有返回的一个特定部门实例的员工对象集的员工属性。 同样,Employee 对象具有部门属性返回对员工所属的部门的信息。

ActiveRecord 项目便于开始构建在上一个可靠的框架 NHibernate 的顶部的应用程序的体系结构。 在几分钟内,您可以创建而无需掌握 NHibernate 的 XML 配置语法使用活动记录模式的类。

价格: 免费的开源。

castleproject.org/activerecord

.NET Framework 中的、 面向方面的编程

分离问题是鼓励分隔应用程序的功能和为不重叠的模块的功能的软件工程的一个核心原则。 每个编程范例有其自己的技术鼓励此。 过程的编程语言允许开发人员可以封装在子例程的功能,; 面向对象的编程语言使用类。

安全,记录,和缓存都是的问题通常应用于多个模块,实现时, 导致分散的多个规则应用到这些模块的代码示例。 这种问题被认为是跨剪切,,被称为方面。

面向方面的编程 (AOP) 是重点处理跨剪切问题分离一个编程范例。 AOP 使开发人员可以创建一个模块中的方面,然后指定这些运行时,才能在执行方法成功,等的一个方法完成时。

例如,与开发人员可以构建运行之前对方法的执行,并验证用户属于某个特定角色,然后指定方法在方面的一个方面的 AOP 适用。 因此,只要这些指定的方法之一将要在运行时执行,相应方面代码执行第一次。 AOP 通常通过实现代码 weaving,这涉及在应用程序代码中相应的点中注入方面代码在编译时或在运行时结束。

签出 PostSharp (版本 1.5) 免费,Gael Fraiteur 可以使用.NET Framework 实现 AOP 方法创建的开源库。 在其核心,PostSharp 分析,并转换.NET 程序集,允许代码 weaving 必要实现 AOP。

此核心上是 PostSharp Laos,轻量的方面面向系统使开发人员能够创建和使用方面的自定义属性。 然后可以使用自定义属性修饰它们以在类或方法应用方面。 或者,方面也可以应用到所有的类或项目的 AssemblyInfo 文件中具有一个特定命名模式通过语法的方法。

图 3 显示了一个 PostSharp 方面进行了错误的通知的示例。 此方面扩展了该 OnExceptionAspect,这意味着在方面可以执行出现未处理的异常可能电子邮件将异常的一个管理员详细信息。 此方面可用于特定的方法,由其修饰 OnException 属性,如下所示:

[OnException("admin@contoso.com")]
private void MyMethod()
{
    // ...
}

图 3 A PostSharp 纵横错误通知

public class OnExceptionAttribute : OnExceptionAspect
 {
    public string ToAddress { get; set; }

    public OnExceptionAttribute(string to)
    {
        ToAddress = to;
    }

    public override void OnException(MethodExecutionEventArgs e)
    {
        // TODO: Send ToAddress an e-mail detailing the exception details.
        // Exception details available in the MethodExecutionEventArgs object
    }
}

立即已编译代码之后,PostSharp 修改 MyMethod 的 IL 代码,周围将现有代码的尝试正在 catch 通过 catch 块内,OnException 方法调用。因此,MyMethod 中未处理的异常时,要调用 OnException 方面。

您会发现一起使用有帮助的消息板在 PostSharp 网站上大量文档。还有社区创建插件、 库,和使用或扩展 PostSharp 其他工具。

价格:免费的开源。

postsharp.org

将您的问题和提出的意见发送至toolsmm@Microsoft.com.

Scott Mitchell的许多书籍和的创始人作者4GuysFromRolla.com作为 MVP 一直从事 Microsoft Web 技术自 1998 年的。Scott 是一个独立顾问、 培训师,兼编写器。访问他在Mitchell@4guysfromrolla.com或在他的博客ScottOnWriting.NET.