【问题标题】:Want to make this permissioning system generic to reduce duplicate code etc想让这个权限系统通用以减少重复代码等
【发布时间】:2011-10-16 19:21:33
【问题描述】:

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

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

如何使用泛型来创建一个方法而不是重复它?

【问题讨论】:

  • ModulePermissions 是什么,或者更具体地说,ModulePermissions[ModuleID] 返回什么?
  • ModulePermissions 只是一组权限,基本上是所有 PermissionGroups 的列表。它将返回权限的掩码(对于那个枚举)

标签: c# generics permissions refactoring


【解决方案1】:

我是这样实现的。

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方法(例如,没有动态和反射)。

【讨论】:

    【解决方案2】:

    IMO 最好将您的枚举更改为类,而不是使用不同的枚举,拥有不同的类和一个枚举(具有不同的访问级别,例如 Level1、Level2 ......将来可能是一些额外的级别),以及所有这些类的继承自基类(如 PermisionAccessBase),该基类具有一个方法(当前具有此信息):CheckAccess(作为虚拟)和一个访问级别枚举类型的属性,所有其他类都以他们想要的方式继承它(可以覆盖基本方法,但您可以有机会调用您的基本方法。

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

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多