想使这个权限系统通用,以减少重复代码等
本文关键字:代码 权限 系统 | 更新日期: 2023-09-27 18:11:37
我有一堆代表应用程序不同部分权限的枚举。
public enum PermissionGroup1
{
CanDo11,
CanDo12,
CanDo13,
}
public enum PermissionGroup2
{
CanDo21,
CanDo22,
CanDo23,
}
public enum PermissionGroup3
{
CanDo31,
CanDo32,
CanDo33,
}
对于给定的用户,我有所有用户权限的集合,然后我有一个方法来检查权限:
public Boolean CheckXXXAccess(int ModuleID, PermissionGroupX permission)
{
bool hasAccess = false;
if (!m_Permissions.ContainsKey(ModuleID))
{
hasAccess = false;
}
else
{
hasAccess = (permission == (ModulePermissions[ModuleID].PermissionGroupX & permission));
}
return hasAccess;
}
因此,为了进一步解释它,数据库包含一个ModuleID(对于给定的模块类型有一个PermissionGroup枚举),然后我有一个类似CheckXXXAccess的方法用于每个模块类型。
我如何使用泛型使一个方法,而不是重复它?
我是这样实现的。
假设Perms
是ModulePermissions[ModuleID]
对象的类。然后你可以像这样委派检查权限:
public bool CheckAccess<T>(int moduleId, T perm) {
if(!ModulePermissions.ContainsKey(moduleId)) return false;
return ModulePermissions[moduleId].HasPermission(perm);
}
Perms
实现:
public class Perms {
List<object> perms = new List<object>();
public bool HasPermission<T>(T perm) {
return perm == (GetPerm(typeof(T)) & perm);
}
dynamic GetPerm(Type permType) {
foreach(var item in perms) {
if(item.GetType() == permType)
return item;
}
throw new Exception();
}
}
这样,您就可以像这样使用新的CheckAccess
方法:
bool b1 = CheckAccess(1, PermissionGroup1.CanDo11);
bool b2 = CheckAccess(3, PermissionGroup3.CanDo32);
当然,你可以根据你的代码规则重写HasPermission
和GetPerm
方法(例如,不带动态和带反射)。
在我看来,最好将枚举更改为类,而不是具有不同的枚举,具有不同的类和一个枚举(具有不同的访问级别,例如Level1, Level2,…所有这些类都继承自基类(比如permissionaccessbase),它有一个方法(目前有这个信息):CheckAccess(作为虚拟)和一个属性类型是Access level Enum,所有其他类都以他们想要的方式继承它(可以覆盖基方法,但你可以有机会调用你的基)。
它不会减少你应该写的函数的数量,但是你可以把方法的公共部分放在基方法中,并在重写的方法中调用它,也会导致概念的分离,我认为你目前用于检查权限的类没有检查权限,如果是这样,所有不同的权限类型检查聚集在一个类中,这是不好的。