用于检查价值存在的更好的代码/模式

时间:2012-08-02 13:57:12

标签: c# asp.net .net algorithm design-patterns

我有web.config条目,如下所示。这是为了控制各种角色的用户访问各种页面。

管理员屏幕可以由招聘经理和CRM1访问 CRM3和受让人可以访问日志屏幕

add key="AdminScreenRoles" value ="Hiring Manager,CRM1"
add key="LogsScreenRoles" value ="CRM3,Transferee "

将来,新角色可以访问管理员界面。此外,还可能会推出新页面。

我需要确保当前用户可以访问配置文件中的至少一个页面。我有以下代码。有用。是否有更好/简洁/可扩展的代码用于此功能?

List<string> authorizedRolesForAdmin = new List<string>((ConfigurationManager.AppSettings["AdminScreenRoles"]).Split(','));
List<string> authorizedRolesForLogs = new List<string>((ConfigurationManager.AppSettings["LogsScreenRoles"]).Split(','));
if ((authorizedRolesForAdmin.Contains(roleName)) || (authorizedRolesForLogs.Contains(roleName)))
{
    //Has access to at least one page
}

参考

  1. Scalable C# Code for Creating Array from Config File

3 个答案:

答案 0 :(得分:2)

您绝对可以大大简化现有代码:

var hasOneRole =
    new [] { "Admin", "Log" }
    .SelectMany( screen => ( ConfigurationManager.AppSettings[ screen + "ScreenRoles" ] ?? "" ).Split( ',' ) )
    .Contains( roleName );

但随着时间的推移,这仍然会变得丑陋。 Web.config只是不适合那种东西。我建议你将访问控制设置放在数据库中。

答案 1 :(得分:1)

如果不是几个建议,请不要在这里找到更多空间来改善事情,例如:

如果角色列表的数量变大

  • 使用Dictionary<RoleName..>HashSet

可以你可以控制喜欢的存在,避免创建额外的List<T>实例

(ConfigurationManager.AppSettings["AdminScreenRoles"]).
              Contains("roleName,")//tiny optimization....

但正如我之前所说,代码现在看起来最好,因为它易于理解和阅读。

答案 2 :(得分:0)

你可以避免拆分字符串,而是使用类似这样的东西,它应该稍快一些:

string authorizedRolesForAdmin = string.Concat(",", ConfigurationManager.AppSettings["AdminScreenRoles"]), ",");
string authorizedRolesForLogs = string.Concat(",", ConfigurationManager.AppSettings["LogsScreenRoles"]), ",");
string searchString = string.Concat(",", roleName, ",");

    if ((authorizedRolesForAdmin.Contains(roleName)) || (authorizedRolesForLogs.Contains(roleName)))
    {
        //Has access to at least one page
    }

这避免了比较昂贵的string.Split,也避免了创建两个列表。值得注意的是string.Contains只是.NET4;在旧版本中,您需要检查string.IndexOf的值。