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

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

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

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

将来,新角色可以访问管理员屏幕。 也可以引入新页面。

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

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

参考

  1. 用于从配置文件创建数组的可扩展C#代码

您绝对可以大大简化现有代码,如下所示:

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

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

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

如果角色列表的数量变大

  • 使用DictionaryHashSet

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

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

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

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

 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的值。