我有一个关于为应用程序角色授权 UI 元素的最佳方法的一般性问题。我的意思是管理员可以看到普通用户看不到的按钮、菜单项等。这方面的最佳做法是什么?
我意识到可能有多个基于角色的屏幕(一个管理屏幕、为用户复制的同一屏幕等),这看起来确实有点过分了。我还想保持关注点分离,这样我的授权码就不会与显示功能混合在一起。换句话说,我想避免:
if( current_user.IsInRole("administrator") )
button.Enabled = true;
我一直在用 PostSharp 查看 Aspects,这似乎几乎正是我想做的,但它似乎并没有在逻辑上扩展到 UI。
我确定我错过了什么,那是什么?
谢谢-
最佳答案
您的代码似乎最终会编译一个 UI 元素列表以隐藏或执行给定操作,然后根据当前角色执行这些操作。有点像
Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>>
{
{ button, (c, r) => c.Enabled = (r == "administrator") },
// etc.
};
您如何编译该列表主要是您的问题所关心的。 AOP 框架肯定有助于分离关注点,但自制解决方案并非不可能。我在想类似的东西:
- 创建一个
EnableForRoleAttribute
,参数为role
。 - 反射(reflection)您的表单(可能使用反射来查找表单,或者可能直接将它们提供给您的代码,甚至查找用您创建的
RoleVaryingAttribute
装饰的表单)。 - 考虑表单的字段,过滤
Control
实例,然后使用EnableForRoleAttribute
过滤Control
实例。 - 现在您有了 list !根据角色设置
Enabled
。
上面的项目符号列表特定于您的 Enabled
示例,主要是因为属性不能将 lambda 作为参数:(。您可以更灵活地使用 SetPropertyIfInRoleAttribute
参数 role
、propertyName
和 propertyValue
。或任何此类构造。
基本上,AOP 框架可以让您更轻松地完成这项工作,而像 PostSharp 这样的框架可以在编译时而不是运行时进行。但是自制解决方案也非常有效。
关于c# - .NET WinForms 中 UI 元素的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461273/