将枚举绑定到静态数据

时间:2013-08-22 18:13:23

标签: c# asp.net-mvc

我正在开发一个必须管理权限的应用程序,我想出了一些我想要一些反馈的设计。我不确定这是否是发布它的正确位置,但我想我们会看到。

可以为我的应用程序中的用户分配权限。他们可以拥有个人级别的权限,也可以拥有组的权限。因此,我有以下表格(我认为名称相对不言自明,但如果需要可以添加更多信息):

  • 用户
  • 权限
  • User_Permissions
  • User_Groups
  • User_Group_Permissions

权限表的设计是这样的:

  • id int(权限ID,主键)
  • name varchar(255)(权限的名称,例如“ADMINISTRATION”)
  • description varchar(1000)(权限的简短描述)
  • default_value tinyint(分配给用户的默认值(是/否/从不))

但是,当我在代码中检查权限时,我不想使用“Magic String”,所以我在权限表中为权限创建了一个枚举,然后像这样使用它:

public enum EPermission
{
    ADMINISTRATION = 1,
    LOGIN = 2
}

public bool HasPermission(EPermission permission)
{
    int permission_id = (int)permission;
    //look up the permission in the database based on permission_id
}

我的权限表中的ID与我在枚举中指定的数字值相匹配。应用程序无法更改这些。权限表中的权限将作为安装的一部分与这些ID一起插入,不应更改。

这种耦合是否可以接受?我并不期望数据能够改变,但它总是可能的,而且我只是想知道在我深入研究之前是否有更好的方法可以做到。

3 个答案:

答案 0 :(得分:1)

是的,它是“可接受的”并且是一种相当普遍的做法。

编辑:如果你想真正减少你的数据库和枚举不同步的可能性,你可以反映枚举在部署期间用数据为你的表种子。

答案 1 :(得分:1)

由于您不更改权限,您也可以离开权限表并仅使用枚举。然后,您可以将枚举的值作为int存储在User_Permissions和User_Group_Permissions表中。

从数据库中检索数据时,您可以将值反序列化为枚举。这样可以降低数据库中的数据损坏并且与枚举不匹配的可能性。

答案 2 :(得分:0)

我怀疑这对长远来说无济于事。什么如果单个用户可以拥有一个或多个权限。那你需要切换标志枚举吗?