2015-11-05 50 views
0

我正在計劃重構授權各種視圖/視圖模型方法/命令的一些遺留代碼。我厭倦了看下面這段代碼。我想用戰略模式。有什麼建議麼 ?什麼是在以下場景中使用的最佳設計模式

public static bool AuthorizeGeneral(string rule) 
    { 
     switch (rule) 
     { 
      case RuleFilterNoteType: 
       return 
        isInRoleSkipManger() || 
        isInRole(RoleNegotiationManager) || isInRole(RoleNegotiationCollector) || 
        isInRole(RoleLitigationManager) || isInRole(RoleRecoveryVicePresident) || isInRole(RoleSkipCollector) || 
        isInRole(RoleLitigationAdministrator) || isInRole(RoleBankruptcyManager) || 
        isInRole(RoleBankruptcyAdministrator); 
      case CanEditExceptionQueueRule: 
       return 
        isInRole(RoleLitigationManager) || isInRole(RoleBankruptcyManager) || isInRole(RoleCOO) || isInRole(RoleEVP) || 
        isInRole(RoleRecoveryVicePresident) || isInRole(RoleNegotiationManager); 
      ... 
      case #150 
      .... 
      case #200 
     } 
    } 
+1

這看起來很有趣:https://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/。如果您將規則抽象爲字符串以外的其他字符並傳入相關角色中,這會不會很容易?我認爲這可能會大幅縮水。沒有模式需要;只是更智能的對象封裝和抽象。字符串並不比原語好得多。 – duffymo

+0

另外,如果它仍在使用舊的成員資格和角色提供者...請考慮使用WIF或Identity Framework切換到聲明。然後使用索賠授權規則來授予或拒絕訪問的東西。 https://msdn.microsoft.com/en-us/library/ms729851(v=vs.110).aspx –

+0

如果問題是關於如何可能想出一個比開關箱怪物更好的方法,我建議看看[lostechies.com/derickbailey/2010/10/07/a-less-ugly-switch-statement-for-c](https://lostechies.com/derickbailey/2010/10/07/a稀少-難看-switch語句換C /)。 – kayess

回答

1

看來你已經通過暗指戰略模式回答了你自己的問題。你需要實現這樣一個接口的具體策略:

interface IAuthorise 
{ 
    bool Authorised(); 
} 

那麼你的具體的戰略填寫的空白:

class CanEditExceptionQueueAuthorisationStrategy : IAuthorise 
{ 
    bool Authorised() 
    { 
     return 
      isInRole(RoleLitigationManager) 
      || isInRole(RoleBankruptcyManager) 
      || isInRole(RoleCOO) 
      || isInRole(RoleEVP) 
      || isInRole(RoleRecoveryVicePresident) 
      || isInRole(RoleNegotiationManager); 
    } 
} 

現在AuthorizeGeneral()可以使用一個工廠來創建相應的策略:

public static bool AuthorizeGeneral(string rule) 
{ 
    var authorisor = AuthorisorFactory.CreateAuthorisor(rule); 

    return authorisor.Authorised(); 
} 

或者它可以有單一的,適當的策略注入。或者它可以注入所有策略並根據rule找到合適的策略。這個決定取決於你有多少規則,以及考慮到這門課以外的代碼對你最有用。

+0

大衛,我已經探索了這條道路,但我面臨的問題是,工廠正在開關案件越來越大,以獲得正確的策略。在我的情況下,我也與B.A和Helpdesk用戶分享這個課程作爲他們管理權限的文檔。 – Van

+0

以下是一些反射或IoC容器的幫助。通過反射,您可以使用類似[規則]策略的類名的約定,然後使用激活器來創建實例。使用IoC容器,根據所選的一個,您可以按照慣例註冊類型,即I.e.實現IAuthorise的類,然後您的工廠可以使用IoC容器來解析適當的類型。溫莎城堡擁有出色的「Typed Factory Facility」,無需編寫任何代碼(https://github.com/castleproject/Windsor/blob/master/docs/typed-factory-facility.md)即可完成此操作。 –

相關問題