2015-12-14 144 views
5

我曾經貢獻過的許多Web應用程序(主要是ASP.NET)都需要處理多種不同的用戶類型。在應用程序中處理不同的用戶類型

比方說,你有一個學校門戶,每天都有學生和老師使用。在應用程序的首頁,用戶會遇到幾乎相同的GUI,除了某些只有教師才能訪問的工具的鏈接。假設這是一個消息工具。教師可以有不同的角色定義教師可以發送給誰。

例如:

  • 教師與角色Publisher被允許發送到每個人都在學校。
  • 沒有額外角色的老師只能發送給他/她的班級中的每個人。
  • 未來,家長還可以訪問此門戶網站並查看有關其子女的詳細信息。

我總是會遇到的問題是,在整個應用程序中處理不同用戶類型時,我的代碼始終與if -statements混淆。不僅因爲不同的用戶類型,而且還因爲不同的業務規則。我覺得我找不到任何方法來正確處理不同的用戶類型。

我猜ASP.NET中的角色概念解決了這個問題,但是你仍然會以if結束 - 在應用程序周圍的陳述。

我的問題是:是否有任何關於如何處理應用程序中不同用戶/用戶類型的最佳做法,而不會感染具有if-聲明的代碼?

回答

2

你應該分開這些責任(例如老師的發送能力)。你可以通過使用策略模式來做到這一點。

因此,老師有一個額外的財產出版,作爲一個接口。該實現可以有多個實現(例如,對於沒有發佈功能的教師或DefaultPublishing,NoPublishing)。每位教師可以將其Publishing屬性設置爲NoPublishing或DefaultPublishing。如果需要,甚至可以改變運行時間。

一個例子:

public class Teacher 
{ 
    public IPublishing Publishing { get; } 
} 

interface IPublishing 
{ 
    void Send(); 
} 

public NoPublishing : IPublishing 
{ 
    public void Send() 
    { 
    // Implementatation 
    } 
} 

public PublishDefault : IPublishing 
{ 
    public void Send() 
    { 
    // Send a message the default way 
    } 
} 

創建一個老師:

var teacher = new Teacher(); 

創建出版商策略。

var defaultStrategy = new PublishDefault(); 

將其連接

teacher.Publishing = defaultStrategy; 

現在,您可以通過發送消息:

teacher.Publishing.Send(); 

根據其發佈的策略已經連接它要麼沒有任何響應或送東西的默認方式。

您只需要實例化每個使用的發佈策略一次,並將其重複用於每個教師(或者甚至其他需要能夠發送的類)。

當您需要其他發佈功能時,只需添加一個新策略(例如SmsPublishing,LetterPublishing等)。

如果需要的話,您甚至可以隨時更改策略(通過重新分配發布屬性)。

爲什麼不直接在教師中實現接口?

  • 問題分離原則:IPublish包含一個特定的和不同的責任。
  • 可能IPublish包含稍後可用於不同類或甚至其他項目的功能,因此它更具可重用性。
  • 由於IPublish不需要關於教師的任何知識,所以測試更容易。
  • 實時更改教師發佈行爲的可能性。

(注意:這裏沒有編譯器,所以代碼僅用於解釋目的)。

+0

如果你對每個用戶類型有不同的類,你會用行爲(用接口完成)來「裝飾」類,這會給他們發佈等的屬性。 –

+0

恐怕我不能正確理解你的問題。 –

+0

我的問題是:你會如何實現這一點?假設您爲每種用戶類型都有不同的C#類。什麼會給他們這種行爲,例如發佈?我想這是通過查看策略模式來回答的,但如果您能夠勾畫出代碼的外觀,這將非常可愛。 –

相關問題