我不是一個架構師,寫下這些內容也僅作為個人的一點總結,以作拋磚引玉之用。
平常在談論系統架構時,我們常常會聽到類似“三層架構”、“多層架構”的說活,但是在嚴格的UML設計卻並沒有直接的對於“層”的形象描述;在典型的基於“4+1視圖”的架構設計文檔中也同樣沒有明確要求對“層”的形象分析。
[注意:喜歡“層”的朋友,在4+1視圖時可在邏輯視圖中單獨添加對“層”的詳細說明]
在基於UML設計時,我們往往會把“分層”的理念分解成“組件”和“包”的形式來展現,但作為一名.net開發人員來說,對於“層”的喜愛卻是由來已久,且其直觀的表觀方式也是無法替代的,就我個人而言非常喜歡使用。以往,我常用PPT來繪制這部分的內容,自從VS2010后,就可以統一到一處了。
一、PetShop分層架構圖
如果您是一個從業多年的.net程序員,那么對PetShop的歷史應該是稍有了解的,自PetShop2.0開始,每升級一次都會伴隨着一個典型“分層架構圖”,我就是從那個時候起開始喜歡上“分層架構圖”的。
PetShop 2.0分層架構圖
PetShop 3.0分層架構圖
PetShop 4.0分層架構圖
二、NLayer分層架構圖
NLayer作為微軟公布的又一個典型的.net技術解決方案,在分層架構上讓人耳目一新,當然看源代碼(解決方案)來理解分層架構可能會比這個給出的架構圖更明了,或者說本可以提供一個更詳細“分層架構圖”。
也許是NLayer給出的分層架構圖,其主要目的是為了展示.net強大的技術體系(正如說明中的“Mapping Technologies”)而非介紹架構思想。但無論如何我們不得不說NLayer在分層上做的還是相當不錯,有較強的代表性。
對NLayer項目感興趣的朋友可以從http://microsoftnlayerapp.codeplex.com/ 了解更多詳情。
以下是這個項目的“多層架構圖”:
三、另一種風格的基於分層架構圖
曾經在CSDN論壇上看到有人提了個分層架構的問題,其中就引用了如下的一個分層架構圖,后經查實其實出自於:http://www.cnblogs.com/ssol/archive/2011/09/14/2175320.html,據我個人分析,這也不愧為一個典型的分層架構圖。
四、Visual Studio對分層的支持
雖說“分層”的做法由來已久,但真正在IDE中得以很好的支持,卻是始於VS2010。在VS2010架構師版中不僅提供了對UML的支持(並非完全),同時也加入了自己 “分層”的理念。同時對於一些典型的架構模式,也提供了基於Visual Studio的插件,以方便設計人員能快速、簡單的繪制分層架構圖。基於VS2010和VS2012插件可以分別通過以下兩個地址進行下載並安裝。
For VS2010:http://visualstudiogallery.msdn.microsoft.com/9c8051f8-e8f7-45b1-8d04-dad6afc697d2
For VS2012:http://visualstudiogallery.msdn.microsoft.com/94ca6b70-539c-4f49-98c9-0550a4c044bf
以下是安裝插件后,分別從VS2010和2012RC上的截圖。
1、 VS2010架構模板
2、 VS2010 Mobile Application
3、 VS2010 Rich Client Application
4、 VS2010 Rich Internet Application
5、 VS2010 Services Application
6、 VS2010 Web Application
7、 VS2012RC 架構模板
8、 VS2012RC Common Application Pattern
9、 VS2012RC Service Archetype Pattern
上述那些分層架構模板都是基於“最佳實踐”的總結,具有很強的代表性。對於一些中小系統都可以直接拿過來用,或稍加修改即可。當然要完全明白各層的含義和作用,建議有興趣的朋友可以參閱一下《Microsoft Application Architecture Guide, 2nd Edition》
http://msdn.microsoft.com/en-us/library/dd673617.aspx,http://apparchguide.codeplex.com/
五、DIY一個Music Store的分層架構圖
由於我們一直采用的CodePlxe中MusicStore其初衷主要用於說明和演練Asp.net mvc技術,所以為了更好的說明架構和分層,我們人為地對其需求進行一定的擴展。
1、 MusicStore是一個基於B/S和C/S混合模式的系統。
2、 MusicStore是一個分布式系統,以支持加盟方式。且各加盟店內部使用C/S方式進行數據管理,以提供更好的用戶體驗。(當然B/S且有同樣的功能)
3、 MusicStore項目需要支持手持設備對唱片進行終端數據管理(如:定期對唱片進行檢查,以確認丟失或損壞),核實信息是以無線的方式與PC進行交互。
4、 可以通過GIS信息查找附件的唱片店。
5、 可以打印用戶自定義的報表或圖表。
(汗!假設的是不是有點過了?)
接下來我們就簡單地來為這些需求設計一個分層架構圖:
1、分層架構圖
2、簡要說明
Business Layer 為基於C/S和B/S模式應用提供統一的分布式應用服務,其中WinForm Presentation Layer 和WEB Presentation Layer都將采用WCF技術與Business Layer通訊。
富客戶端方面,采用WinForm方式進行UI設計,同時引進第三方DeVExpress控件庫進行美化;為了能較好的實現單元測試,采用MVP模式進行實現。
WEB方面,前台采用ExtJS腳本庫,並采用ASP .NET MVC 3作為實現主框架。
業務邏輯層主要基於領域服務來實現,並通過統一的封裝為各客戶端提供應用服務。本系統中采用DDD方式設計,DomainEntity作為各層間主要對象傳輸。
倉儲層主要采用MS SqlServer來為較大的連鎖店供數據服務,當然也可以采用基於MS Access來為單個店面提供數據服務。倉儲層采用Adapter設計模式以支持不同數據庫系統,並接合IOC來進行動態配置。同時,對於基於SqlServer數據庫系統的實現采用Asp.net Entity Framework技術實現;對基於Access數據庫系統的采用ADO .NET技術實現。
其中公共部分:通訊服務、GIS服務和Report服務為獨立子系統,其具體實現可以獨立分層和設計,此處不做詳述。Security為系統提供安全;MSEL為微軟件企業庫,可以提供IOC框架、緩存機制、基於ADO .NET的數據庫訪問操作、異常處理、UI驗證等;NLog為本系統的提供日志管理框架。
六、分層架構圖的主要作用
不管一個系統有多么復雜,如果最后形成了循環引用,那么基本上可以斷定是因為在設計時分層沒有做好。分層架構的好處不作多說,我們只說說“分層架構圖”的主要作用。
1、雖說UML定義為統一建模語言,但在其實操作和講解上,其理論與技術實現還是需要一定的語言基礎。相對UML來說,“分層架構圖”就顯得更加隨和一些,對於一些特定客戶,“分層架構圖”在闡述技術方向、系統運作、應對變化等方面卻有獨到之處。
2、“分層架構圖”簡潔明了的表現形式不僅能給非技術人員一目了然的感覺。對於技術人員也有一種高屋建瓴,撥雲見日的感覺,使得開發人員能立即明白架構師的主要意圖和思想。
3、“分層架構圖”首先能直觀的描述系統的主要子系統、主要組件及其關系,為后繼UML中“組件圖和包圖”的划分提供指導。
4、在形成“分層架構圖”時,架構師往往還需要分析出要使用哪些公共組件模塊,有些模塊可能現在不存在,但在本項目實施后可形成。有些可能已經有的存在,可直接使用。公共組件的積累也往往會伴隨一個公司軟件開發的成長,好的組件設計和成果也是公司的一項重要財富。
七、分層架構圖的大同小異
曾經在參加一個評審時,有人問到:“你的這個分層架構圖怎么和微軟件提供的模板看上去大同小異?” 其實確實如此!在我們的身邊並不是所有的項目都是大項目、都是戰略性的,在架構設計上要有獨到之處,以解決復雜的需求和性能要求。而大部分的項目則是一些中小型的應用系統、甚至還有一些是用於“科研”的小程序,對於這部分項目我們完全可以借用比較常見的分層架構模板來完成,以節約設計時間。由於這些模板是基於實踐的總結,其總體思想、思路、解決方案都比較成熟,也就是從宏觀上來說就是“三層到多層”的通用解決方案,即大同!而小異則是基於項目本身的特點於細節處的區別,做到具體問題具體分析。比如我們可以采用WebForm的方式也可以采用ASP .NET MVC的方式作為表現層的實現方式;可以采用SqlServer 2005,也可以采用Oracol 10g作為數據庫系統;同樣的我們可以跟據項目的部署情況決定采用“貧血模式”或“充血模式”,這就不能一概而論了。