2011-04-11 42 views
4

對於我們的.Net應用程序,我們已將許可組件集成到應用程序中。在應用程序代碼中,我們驗證許可證,並基於它,我們需要啓用/禁用某些功能。例如,如果用戶擁有試用許可證,則他們只能訪問特定的應用程序部分,而付費用戶則可以訪問任何部分。 我需要幫助確定設計,使影響最小。我不想用if..else語句散佈代碼。請與我分享一些實現此目標的最佳方法。集成許可證處理的設計選擇

回答

2

您是否反對使用If/Else語句來檢查啓用的功能,或者在您的主​​程序邏輯中專門詢問許可證系統?

我不明白如何在沒有If/Else語句的情況下禁用功能,但是如果您有一個許可證類來爲您處理所有事情,您可以保持它的整潔。

我將有一個許可證類在應用程序啓動時初始化,並且有一個public bool IsFeatureLicensed(string MethodName)方法。

每個方法都提供一個功能,您希望通過授權保護可能有類似:

If (LicenceManager.IsFeatureLicensed(Reflection.MethodBase.GetCurrentMethod.Name)) { 

    //Do your stuff! 

} else { 
    //Throw exception or show error message or something. 
} 

的IsFeatureLicensed方法在LicenseManager有類,您創建將看看方法名稱,並檢查查看許可證是否允許使用該方法提供的功能。它應該在所有情況下都返回True,除非許可證禁止使用該功能。

這樣,每種方法都可以對許可證管理器進行相同的調用(使維護變得非常容易),並且與授權內容相關的所有內容都封裝在一個類中。這使您可以非常輕鬆地更改許可方法(例如,您可以在開發過程中將所有內容都返回True),並且不需要觸摸其他應用程序。

5

一如往常,答案是replace conditional with polymorphism

將每個特徵封裝爲Strategy,並將禁用的特徵實施爲Null Object。兩者都可以封裝在條件爲Composite中,該條件基於許可組件在兩者之間進行選擇。

舉個例子,假設你有一個打印功能封裝在一個IPrinter接口的後面。您實現RealPrinter類中的實際功能和NullPrinter類中的禁用功能,都實現了IPrinter接口。

許可檢查可在GuardedPrinter類中實現,這將是這個樣子:

public class GuardedPrinter : IPrinter 
{ 
    private readonly IPrinter realPrinter; 
    private readonly IPrinter nullPrinter; 
    // more fields and initialization omitted for brevety... 

    public PrintResult Print() 
    { 
     if (this.licence.IsEnabled) 
     { 
      return this.realPrinter.Print(); 
     } 

     return this.nullPrinter.Print(); 
    } 
} 
1

您可以事先有幾個「授權產品」每個產品有它自己的一套獨特的許可密鑰。產品A可能會解鎖功能1,2和3,而產品B只能解鎖功能1.在實例化功能1的構造函數中,您可以檢查特定的許可代碼以檢查此許可證密鑰是否對產品A有效或產品B.您可以對功能2和3執行相同的操作,只檢查與產品B有關的許可證密鑰。

檢查應該靜態完成,這樣如果驗證第一次通過,那麼如果特徵A被實例化,則永遠不應該再次檢查驗證。靜態授權管理器類可能可以處理這個問題。

在試用許可證密鑰和特定功能被禁用的情況下,我會將該試用日期嵌入到許可證密鑰中 - 因此即使許可證密鑰經過驗證,如果您看到試用日期,也會例外在構造函數級別。