2011-07-20 60 views
5

我有一個CustomAuthorize屬性,用於檢查用戶是否有權訪問功能(用戶或角色可以與層次集函數中的項目相關聯)。在設計/構建時檢查自定義屬性參數

對於給定的操作方法......

[CustomAuthorize("Security.Admin.ManageWidgets.Update")] 

這工作,但我擔心更改安全對象可能會導致不會直到運行時發現的問題。我意識到我可以編寫單元測試來減輕這種風險,但我想知道是否可以在編譯時檢查屬性參數。我也喜歡讓Intellisense幫我輸入這個表達式。

理想情況下,我可以傳遞一個lambda表達式。

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)] 

不幸的是這is not currently possibleadditional info from Microsoft)。

我也試過封裝表達希望它會進行評估,然後傳遞到該屬性爲一個字符串,但是這也失敗,同樣的錯誤(表達式不能包含匿名方法或lambda表達式)進行編譯。

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))] 

我如何可以添加我的自定義一些設計時/編譯時支持屬性參數?

+0

+1有趣的問題。 – Mrchief

回答

1

您可以使用T4 templates創建具有字符串屬性的自定義類,最終的代碼類似於BennyM's,但會自動生成。

+0

這可能讓我走上了正確的軌道 - 我的Security對象已經自動生成,我可以爲每個具有完全限定名的類/子類添加一個const。它並不完全驗證字符串是否正常,但由於它是自動生成的,我可以安全地做出這樣的假設(並且我得到智能感知)。 – Mayo

3

帶常數的靜態類。

public static class Rights 
{ 
    public const string UpdateWidgets = "UpdateWidgets"; 
} 

還包括與他們裝飾的方法,你會很好的unittests。

[CustomAuthorize(Rights.UpdateWidgets)] 
1

不,你不能在編譯時檢查這些各種各樣的事情 - 你可以抱最好的希望是一個生成後的步驟,通過反射檢查這一點。

您可以改爲提供一個類型和方法名,如:

[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")] 

但看到你仍然需要鍵入其值得商榷什麼好處這真的獲得你的方法的名稱。

相關問題