2010-12-16 38 views
5

我有一個關於授權應用程序角色的UI元素的最佳方法的一般問題。我的意思是管理員可以看到常規用戶無法看到的按鈕,菜單項等。最佳做法是什麼?.NET中的UI元素授權WinForms

我意識到,可能有多個屏幕基於角色(管理員屏幕,用戶等重複相同的屏幕),這絕對看起來像矯枉過正。我還希望保持關注點分離,以便我的授權代碼不與顯示功能混雜在一起。換句話說,我想避免:

if(current_user.IsInRole("administrator")) 
    button.Enabled = true; 

我一直在尋找與PostSharp,這似乎幾乎正是我想要做的方面,但它似乎並沒有邏輯上延伸到UI。

我確定我錯過了什麼,它是什麼?

謝謝 -

回答

5

這很可能是你的代碼最終會編譯UI元素的列表隱藏,或執行給定的動作,然後執行基於當前角色的行動。類似於

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

如何編譯該列表主要是您的問題所關心的問題。 AOP框架絕對有助於解決問題,但自制解決方案不是不可能的。我在想:

  • 創建一個EnableForRoleAttribute,參數role
  • 反映在您的表格上(可能使用反射來查找表格,或者可能直接將它們提供給您的代碼,或者甚至找到用您創建的RoleVaryingAttribute裝飾的表格)。
  • 反映在您的表單的字段中,篩選Control實例,然後針對Control實例使用EnableForRoleAttribute
  • 現在你有你的名單!根據角色設置Enabled

以上項目符號列表是特定於Enabled例子,主要是因爲屬性不能把lambda表達式作爲參數:(。你可以用SetPropertyIfInRoleAttribute與參數rolepropertyNamepropertyValue,或者任何這樣更靈活。建設

基本上,AOP框架,使這項工作更容易爲你,有的像PostSharp做到這一點,在編譯時,而不是運行但自制的解決方案是非常有效的太

+0

Domenic - 。感謝時,SetPropertyIfInRoleAttribute (或SetPropertyByRole屬性)似乎是一個很好的中間立場,而且從這一刻起我傾向於這種方式。很好的解釋,謝謝澄清。現在我看到,在一個Attribute構造函數中的lambda會非常有用! – grefly 2010-12-16 17:13:47

+0

作爲後續,我使用PostSharp遇到的問題是我無法獲得自定義屬性,因爲我在實例級別上裝飾了.NET框架類(文本框等)。我想我會再次遇到同樣的問題。雖然你對原始問題提供了很好的答案,但一個答案通常會導致另外兩個問題...... = D – grefly 2010-12-16 17:16:52