2010-05-01 75 views
0

我從來沒有見過這樣做,但我有一個更純粹的OO方式進行授權的想法。對於每個需要授權的方法,我們都關聯一個委託。在類的初始化期間,我們連接代表,以便它們指向適當的方法(基於用戶權限)。例如:更純粹的OOP風格的授權

class User 
{ 
    private deleteMemberDelegate deleteMember; 

    public StatusMessage DeleteMember(Member member) 
    { 
     if(deleteMember != null) //in practice every delegate will point to some method, even if it's an innocuous one that just reports 'Access Denied' 
     { 
      deleteMember(member); 
     } 
    } 

    //other methods defined similarly... 

    User(string name, string password) //cstor. 
    { 
     //wire up delegates based on user's rights. 
     //Thus we handle authentication and authorization in the same method. 
    } 

} 

這樣客戶端代碼永遠不必明確地檢查用戶是否在角色中,它只是調用方法。當然,每種方法都應該返回一個狀態消息,以便我們知道是否以及爲什麼失敗。

想法?

回答

1

這基本上是null object pattern授權。如果你能想出一種設計StatusMessage的方法,這樣調用代碼不需要特殊情況,這是一個有趣的想法。例如,對於某些操作,您需要指出「您不能以訪客身份登錄,但是您想登錄還是註冊一個賬戶?」所以某些StatusMessages可能需要重定向到登錄/註冊頁面。

+0

謝謝馬修。我編輯了我的問題來澄清,在實踐中,每個代表實際上都會指向某個方法,即使該方法只是說明爲什麼不允許某個特定的操作。我很欣賞Null Object Pattern中的信息,現在我正在閱讀它。 – 2010-05-01 02:11:31

+0

@Matthew - 啊,現在我正在閱讀模式文獻。所以我可能希望StatusMessage類實現命令模式。 – 2010-05-01 02:22:11