想使这个权限系统通用,以减少重复代码等

本文关键字:代码 权限 系统 | 更新日期: 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的方法用于每个模块类型。

我如何使用泛型使一个方法,而不是重复它?

想使这个权限系统通用,以减少重复代码等

我是这样实现的。

假设PermsModulePermissions[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);

当然,你可以根据你的代码规则重写HasPermissionGetPerm方法(例如,不带动态和带反射)。

在我看来,最好将枚举更改为类,而不是具有不同的枚举,具有不同的类和一个枚举(具有不同的访问级别,例如Level1, Level2,…所有这些类都继承自基类(比如permissionaccessbase),它有一个方法(目前有这个信息):CheckAccess(作为虚拟)和一个属性类型是Access level Enum,所有其他类都以他们想要的方式继承它(可以覆盖基方法,但你可以有机会调用你的基)。

它不会减少你应该写的函数的数量,但是你可以把方法的公共部分放在基方法中,并在重写的方法中调用它,也会导致概念的分离,我认为你目前用于检查权限的类没有检查权限,如果是这样,所有不同的权限类型检查聚集在一个类中,这是不好的。