ABP框架提供了 实体扩展系统, 允许你在无需修改相关类的情况下添加额外属性到已存在的对象 . 它允许你扩展应用程序依赖模块实现的功能,尤其是当你要扩展模块定义的实体和DTO时.
你自己的对象通常不需要对象扩展系统,因为你可以轻松的添加常规属性到你的类中.
IHasExtraProperties 接口
这是一个使类可扩展的接口. 它定义了 Dictionary 属性:
Dictionary ExtraProperties { get; }
然后你可以使用此字典添加或获取其他属性.
基类
默认以下基类实现了 IHasExtraProperties 接口:
- 由 AggregateRoot 类实现
- 由 ExtensibleEntityDto, ExtensibleAuditedEntityDto... DTO基类实现.
- 由 ExtensibleObject 实现, 它是一个简单的基类,任何类型的对象都可以继承.
如果你的类从这些类继承,那么你的类也是可扩展的,如果没有,你也可以随时手动继承.
基本扩展方法
虽然可以直接使用类的 ExtraProperties 属性,但建议使用以下扩展方法使用额外属性.
SetProperty
用于设置额外属性值:
user.SetProperty("Title", "My Title");user.SetProperty("IsSuperUser", true);
SetProperty 返回相同的对象, 你可以使用链式编程:
user.SetProperty("Title", "My Title") .SetProperty("IsSuperUser", true);
GetProperty
用于读取额外属性的值:
var title = user.GetProperty("Title");if (user.GetProperty("IsSuperUser")){ //...}
- GetProperty 是一个泛型方法,对象类型作为泛型参数.
- 如果未设置给定的属性,则返回默认值 (int 的默认值为 0 , bool 的默认值是 false ... 等).
- 如果属性类型不是原始类型(int,bool,枚举,字符串等),你需要使用 GetProperty 的非泛型版本,它会返回 object.
HasProperty
用于检查对象之前是否设置了属性.
RemoveProperty
用于从对象中删除属性. 使用此方法代替为属性设置 null 值.
最佳实践
为属性名称使用魔术字符串很危险,因为你很容易输入错误的属性名称-这并不安全;
- 为你的额外属性名称定义一个常量.
- 使用扩展方法轻松设置你的属性.
public static class IdentityUserExtensions{ private const string TitlePropertyName = "Title"; public static void SetTitle(this IdentityUser use