用于检查价值存在的更好的代码/模式
我有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 }
参考 :
- 用于从配置文件创建数组的可扩展C#代码
您绝对可以大大简化现有代码,如下所示:
var hasOneRole = new [] { "Admin", "Log" } .SelectMany( screen => ( ConfigurationManager.AppSettings[ screen + "ScreenRoles" ] ?? "" ).Split( ',' ) ) .Contains( roleName );
但随着时间的推移,这仍然会变得丑陋。 Web.config只是不适合那种东西。 我建议你将访问控制设置放在数据库中。
如果不是几个建议,请不要在这里找到更多空间来改善事情,例如:
如果角色列表的数量变大
- 使用
Dictionary
或HashSet
可能是你可以控制喜欢的存在,避免创建额外的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
的值。