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

时间:2011-10-16 19:21:33

标签: c# generics permissions refactoring

我有一堆枚举,代表了应用程序各个部分的权限。

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的方法。

如何使用泛型制作单一方法而不是重复方法?

2 个答案:

答案 0 :(得分:2)

我已经这样实现了。

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);

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

答案 1 :(得分:1)

IMO最好将您的枚举更改为类,而不是具有不同的枚举,具有不同的类和一个枚举(具有不同的访问级别,例如Level1,Level2,......可能是未来的一些额外级别),并且所有这个类继承自基类(如PermisionAccessBase),它有一个方法(目前有这个信息):CheckAccess(作为虚拟),一个属性类型为Access Level Enum,所有其他类以他们想要的方式继承它(可以覆盖基本方法但你有机会打电话给你的基地。)

它不会减少你应该编写的函数的数量,但你可以将基本方法的常用部分放在基本方法中,并在覆盖的方法中调用它,也导致概念分离,我认为你目前使用的类是检查权限不用于检查权限,如果是,则在一个类中收集的所有不同的权限类型检查都不好。