通過動態構建Expression Select表示式並建立動態型別來控制Property可見性
阿新 • • 發佈:2021-02-01
## 通過建立動態型別 動態構建Expression Select表示式來控制Property可見性
> 專案中經常遇到的一個場景,根據當前登入使用者許可權,僅返回許可權內可見的內容。參考了很多開源框架,更多的是在`ViewModel`層面硬編碼實現。這種方式太過繁瑣,每個需要相應邏輯的地方都要寫一遍。經過研究,筆者提供另外一種實現,目前已經應用到專案中。這裡記錄一下,也希望能給需要的人提供一個參考。
### 1、定義用於Property可見性的屬性PermissionAttribute
`PermissionAttribute.Permissions`儲存了被授權的許可權列表(假設許可權型別是`string`)。建構函式要求`permissions`不能為空,你可以選擇不在`Property`上使用此屬性(對所有許可權可見),或者傳遞一個空陣列(對所有許可權隱藏)。
```
///
/// 訪問許可屬性
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public class PermissionAttribute : Attribute
{
public readonly IEnumerable Permissions;
public PermissionAttribute([NotNull] params string[] permissions)
{
this.Permissions = permissions.Distinct();
}
}
```
### 2、定義Entity,給個別Property新增PermissionAttribute屬性來控制可見性
`Name`屬性的訪問許可權授權給**`3、4`**許可權,`Cities`授權給`1`許可權,`Id`屬性對所有許可權隱藏,`Code`屬性對所有許可權都是可見的。
```
///
/// 省份實體
///
[Table("Province")]
public class Province
{
///
/// 自增主鍵
///
[Key, Permission(new string[0])]
public int Id { get; set; }
///
/// 省份編碼
///
[StringLength(10)]
public string Code { get; set; }
///
/// 省份名稱
///
[StringLength(64), Permission("3", "4")]
public string Name { get; set; }
///
/// 城市列表
///
[Permission("1")]
public List