2

我正在爲特定客戶編寫大型應用程序。 該應用程序包含許多功能,但並非所有客戶都需要所有功能,因此經過大量思考後,我決定將應用程序的各個部分劃分爲模塊,其中模塊是獨立部分。 我現在正在從我的舊代碼開始創建模塊。 由於這是Web應用程序,每個客戶都有自己的用戶名和密碼。我應該只加載他的模塊 - 只有他的模塊應該可用。另外,我有兩種不同的能夠互動的能力,有時如果一個客戶有兩種能力 - 我想公開「組合網頁」而不是一個具體能力的網頁,所以在哪個模塊中這個「組合網頁「應該是? 我還沒有設法定義包含哪些模塊。 Doess模塊​​包含自己的數據庫表?模塊是否包含自己的網頁?模塊是否有自己的庫項目?依此類推。模塊劃分 - 如何做到正確?如何分離存在的能力?

有沒有人可以在所有模塊部門中創建或命令?我真的迷失在這裏,我不知道如何繼續。

我使用asp.NET使用C#和web服務,jQuery和SQL Server 2005的

+0

您可能需要使用「選項」或「功能」的話,而不是「能力」。 – umlcat 2011-03-19 18:00:38

+0

1)「只加載他的模塊」是什麼意思?將模塊(DLL)加載到Web服務器內存中?或者你只是想控制訪問網站的獨立部分? 2)你的模塊是什麼意思?像使用單一通用基礎架構的獨立分層應用程序? 3)給出一些模塊間交互的例子 - 模塊是否需要相互瞭解,一個模塊是否需要其他模塊來完成它的工作? – NOtherDev 2011-03-19 19:07:44

+0

@umlcat:我同意你的看法。 – Naor 2011-03-19 19:07:53

回答

0

我認爲authorization management in ASP.NET應該讓你做你的需要:作爲this link解釋的,可以通過網頁或管理權限,就像你的情況一樣,文件夾。例如,如果你只想從組別1用戶訪問Folder1中,從組2用戶訪問文件夾2,都訪問Folder3,你的Web.config應該是這樣的:

<configuration> 
    .... 
    <!-- Normal config here //--> 
    <system.web> 
    .... 
    </system.web> 

    <!-- Page-specific settings for folder1 here //--> 
    <location path="folder1"> 
     <system.web> 
      <authorization> 
       <allow users="Group1" /> 
      </authorization> 
     </system.web> 
    </location> 

    <!-- Page-specific settings for folder2 here //--> 
    <location path="folder2"> 
     <system.web> 
      <authorization> 
       <allow users="Group2" /> 
      </authorization> 
     </system.web> 
    </location> 

    <!-- Page-specific settings for folder3 here //--> 
    <location path="folder3"> 
     <system.web> 
      <authorization> 
       <allow users="Group1, Group2" /> 
      </authorization> 
     </system.web> 
    </location> 
</configuration> 
+0

我正在談論更復雜的事情,然後是用戶界面特權。我正在討論將應用程序分成幾個獨立的模塊。 – Naor 2011-03-18 03:02:40

+0

好了,對不起,誤會...... – Emmanuel 2011-03-18 08:44:35

0

這不是最複雜的解決方案,但這是我怎麼做的 - 每個用戶都由一個User對象表示,該對象具有AvailableModules屬性,或者可能具有HasModule(模塊)功能。
集中式存儲庫包含代表當前登錄用戶的對象,以及需要查詢的用戶。
對於示例 - 表現層將有

if (UsersRepository.CurrentUser.HasModule(Module.Admin)) 
{ 
labelAdmin.visible = true; 
//other presentation stuff here 
} 

服務層將有:

public void Do AdminStuff() 
{ 
    if (!UsersRepository.CurrentUser.HasModule(Module.Admin)) 
    { 
    throw new UnauthorizedAccessException("User isn't an admin"); 
    } 
    //do your admin stuff 
} 

等。
請注意,您可以使用它來將操作分離到不同的類。爲實例 -

public interface ISomeService 
{ 
    public void DoService((); 
} 

和調用代碼可以有─

ISomeService service = new ViewerService(); 
if (UsersRepository.CurrentUser.HasModule(Module.Admin)) 
{ 
    service = new AdminService(); 
} 
+0

你怎麼處理這個涉及到不止一個模塊的行爲嗎?你的應用程序中包含哪些模塊(用戶界面,db層,bll)? – Naor 2011-03-18 03:06:11

2

這是很難說如何設計模塊,因爲它是專門針對你的應用領域和建築因素。

您可以在各種級別的應用程序中定義模塊,模塊設計可視爲獨立於任何特定語言。請記住,如果您沒有繪製特定的邊界,那麼過多的重用(耦合)可能會產生負面影響,因爲更改會影響應用程序。一個很好的防禦就是設計預期的變化。因此,它會影響你的整個架構! 「獨立部分」很好,但您需要在體系結構中定義「級別」:您可以擁有功能模塊,「技術」模塊(基礎結構代碼),運行時模塊,甚至是部署模塊。每個類型在大型應用程序中都很重要

從你的問題件(不知道你的域名是關於什麼的),這裏有一些建議:

  • 通過給它自己的數據庫隔離的網絡服務。 (獨立)。
  • 讓Web服務調用其他Web服務(封裝/合成)
  • 使用代碼,文件或db中的配置(每個客戶,每個Web服務)爲客戶加載功能模塊。 (請參閱Dependency Injection作爲適用於配置問題的良好模式。)
  • 使用域/業務要求作爲Web服務和模塊的指南。
  • 看看Domain Driven Design,特別是有界上下文。那裏有很多模式可以讓你瞭解如何模塊化你的應用程序。
  • 預測變化(不是太深),並嘗試設計你的體系結構(技術和功能)。
  • 將您的應用程序分解爲重用基礎架構(技術)模塊的功能模塊。與層隔離。

注:這真的取決於你的域:例如,你可以有一個應用程序,支持多用戶和他們僅隔基礎上,角色(客戶,員工,金牌客戶..),他們有。對於一些用戶甚至可能有單獨的Web服務,但他們都可以使用「Web演示/應用程序」服務僅用於用戶界面。

+0

我的問題不是如何根據域來定義模塊,但 - 我幾乎可以做到這一點?每個模塊包含什麼(幾乎 - 代碼?網頁?數據庫對象?等)。 – Naor 2011-03-20 13:29:16

+0

好吧,這並不容易,看來你想要的實現細節,即。有關如何構建系統的「詳細技術文物」? – 2011-03-20 13:34:39

+0

只是要清楚:我暗示讓企業/域名引導您參加您將構建的工件/模塊......本着DDD的精神。 – 2011-03-20 13:43:30

2

您正在尋找什麼叫多租戶解決方案,這不是什麼新鮮事。有幾種不同的解決方案可用。首先:習慣所有模塊同時加載給所有人。除非你想開始與appdomains玩雜耍,否則任何事情都是不可能的。這可以很快得到討厭。

你所做的只是控制爲用戶顯示哪些鏈接等,並驗證所有請求,以便用戶有權做他想做的事情。

至於權限處理,我使用.Net中內置的一個。我爲用戶有權訪問的每個模塊添加了一個角色。通過這種方式,我可以使用[PrincipalPermission(XXXX)]屬性來標記我的所有方法以控制安全性。請閱讀定製IPrincipalIIdentity

接下來要解決的是代碼佈局。每個模塊我有一個類庫。在該模塊中,我擁有所有圖層(存儲庫,模型,服務和視圖)。除了那些應該暴露給系統其餘部分的類以外,所有內容都標記爲internal

你需要一些東西來將所有東西捆綁在一起,這是最棘手的部分。您需要長時間思考要創建哪些接口才能讓模塊相互交互。

我不建議你使用控制反轉容器(我最喜歡的是autofac)和Asp.NET MVC因爲這兩個給你一定的靈活性,並使其更容易建立這樣的系統。

+0

這是我正在尋找的答案。我真的很喜歡代碼示例,因爲我不太瞭解你如何使用你描述的方法。 – Naor 2011-03-26 04:22:43

1

這聽起來像你所說的模塊是一個網站的部分,而不是一種商業模式的部分。如果您願意使用ASP.NET MVC,它們爲這種分離提供了非常有用的約定。它被稱爲「地區」。看看http://msdn.microsoft.com/en-us/library/ee671793.aspx這是一個步行和示例項目。另外還有一個介紹性視頻http://www.asp.net/mvc/videos/aspnet-mvc-2-areas。我認爲你可以通過使用MVC區域和ActionFilters來完成所有你想要的任務,這些區域和ActionFilters會選擇每個動作的角色需求。