2013-08-22 131 views
0

我正在研究一个必须管理权限的应用程序,并且我想出了一个我想要的反馈意见。我不确定这是不是正确的地方发布它,但我想我们会看到。将枚举绑定到静态数据

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

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

The design of权限表是这样的:

  • ID INT(许可ID,主键)
  • 名称VARCHAR(255)(许可的名称,如 “管理”)
  • 描述VARCHAR(1000)(许可的简短说明)
  • DEFAULT_VALUE TINYINT(默认值分配给用户(是/否/不))

然而,当我检查代码中的权限,我不想使用“魔术字符串”,所以我创建了一个枚举在我的权限表的权限,然后使用它像这样:

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插入,不应更改。

这种连接可以接受吗?我不希望数据发生变化,但它总是可能的,而且我只是想知道在我深入研究之前是否有更好的方法来做事。

回答

1

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

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

+0

有趣 - 没有想到反思的想法。它只会被部署一次(或者至少在一个地方),所以也许这对我的情况有点过分,但是谢谢。 – Mansfield

1

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

从数据库中检索数据时,可以将值反序列化为枚举值。这样可以减少数据库中的数据被破坏并且不再与您的枚举相匹配的可能性。

0

我怀疑它不会帮助长期运行。什么如果一个用户可以拥有一个或多个权限。那么你需要切换标志枚举?

+0

该枚举只代表一个权限。一个用户可以拥有多少个 - 我只关心枚举和权限表之间的耦合。 – Mansfield