NHibernate 和 virtual 关键字的简单 Aspect





4.00/5 (1投票)
一篇介绍如何使用简单方面来自动使类成员成为 virtual 的文章。
引言
使用 NHibernate 的人知道,为了利用其延迟加载功能,持久化类的所有公共成员都必须标记为 virtual
。 与延迟加载带来的所有好处相比,这似乎是一个非常微不足道的代价。 然而,对于一些人,包括我,这个额外的 virtual
关键字仍然有些烦恼。 在编写新代码时很容易忘记它,它有时会使 Resharper 抱怨(“构造函数中的 virtual 成员调用”警告),而且它很丑陋(主观的,我知道)。 在本文中,我想展示如何使用一个简单的方面来解决这些问题,该方面使成员 virtual
,即使源代码中未使用该关键字。
背景
本文中提出的解决方案对于使用 NHibernate 的人(也通过 Active Record 间接使用)最有用。 如果你不知道什么是 NHibernate,我建议你在这里查看 here。
使用方面
为了使用方面,你首先需要下载并安装 PostSharp。 本文的其余部分假设 PostSharp 已安装并启用了 MSBuild 集成。
下载 Unsealer,并将 Unsealer.Weaver.dll 和 Unsealer.psplugin 文件复制到 PostSharp 安装文件夹下的 Plugins 目录中。 将 Unsealer.dll 复制到你为解决方案保存外部库的文件夹中。
打开 Visual Studio,并将以下引用添加到包含你的持久化类的项目中
- PostSharp.Public.dll
- Unsealer.dll
此时,Unsealer 在项目上启用。现在,你可以
- 使用
[Unseal]
属性装饰每个持久化类,或者 - 使用快捷方式,并添加
[assembly: Unseal(AttributeTargetTypes = "*")]
行到 AssemblyInfo.cs 文件。 这将使你完全忘记 virtual
。
就是这样 - 关键字可以从类中删除。 NHibernate 将继续运行,就像什么都没发生一样,如果你使用 Reflector 检查 DLL,你将看到所有公共成员都是 virtual 的。
注释
尽管方面的名称是 Unsealer,但它不会从方法中删除 sealed
关键字。 实际上,如果 [Unseal]
属性用于具有 sealed
成员(或本身是 sealed
)的类,它会导致构建失败。 这是因为我假设 sealed
关键字总是被有意使用 - 区别于 virtual
,它可能被意外跳过。