.NET WinForms中UI元素的授权

gre*_*fly 5 .net c# user-interface aop authorization

我有一个关于为应用程序角色授权UI元素的最佳方法的一般性问题.我的意思是管理员可以看到普通用户看不到的按钮,菜单项等.这是什么最好的做法?

我意识到可能有多个基于角色的屏幕(一个管理员屏幕,同一个屏幕重复用户等),这看起来有点矫枉过正.我还想保留Separation of Concern,这样我的授权代码就不会与显示功能混合在一起.换句话说,我想避免:

if( current_user.IsInRole("administrator") )
  button.Enabled = true;
Run Code Online (Sandbox Code Playgroud)

我一直在使用PostSharp查看Aspects,这看起来几乎就是我想做的事情,但它似乎并没有在逻辑上扩展到UI.

我确定我错过了什么,它是什么?

谢谢 -

Dom*_*nic 5

您的代码最终可能会编译一个UI元素列表以隐藏,或执行给定的操作,然后根据当前角色执行这些操作.就像是

Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>>
{
    { button, (c, r) => c.Enabled = (r == "administrator") },
    // etc.
};
Run Code Online (Sandbox Code Playgroud)

如何编译该列表主要是您的问题所关注的.AOP框架肯定有助于分离关注点,但自制解决方案并非不可能.我想的是:

  • EnableForRoleAttribute使用参数创建一个role.
  • 反思您的表单(可能使用反射来查找表单,或者可能直接将它们提供给您的代码,或者甚至找到用RoleVaryingAttribute您的创建装饰的表单).
  • 反映表单的字段,过滤Control实例,然后对Control实例进行过滤EnableForRoleAttribute.
  • 现在你有了你的清单!Enabled根据角色设置.

以上项目符号列表是特定于您的Enabled例子,主要是因为属性不能把lambda表达式作为参数:(,你会是一个更加灵活的SetPropertyIfInRoleAttribute与参数role,propertyNamepropertyValue,或者任何这种结构.

基本上,AOP框架使这项工作更容易,而像PostSharp这样的一些框架使它在编译时而不是运行时发生.但自制软件解决方案也非常有效.