.Net項目分層與文件夾結構大全


目前為止,最佳架子獎:  聖殿騎士!!!

評選理由:

老油條了,沒啥好說的....分層的描述很准確。

特別是WebModel(ViewModel)的理解和描述很到位,避免了搞ViewModel的設計過渡之嫌,如果你有設計ViewModel的話....

可惜缺乏對數據訪問層的描述,不知道會不會陰溝里翻船...

 

01,User Interface即UI層:該層作為數據輸入和展示的界面,是與用戶交互的有效途徑,所以它起着至關重要的作用。往往給人第一印象的就是UI層,在設計的時候也要根據不同的技術或者不同的要求進行斟酌。通常可以把UI分為B/S UI、C/S UI以及WEB服務。在這里就是我們的ASP.NET項目。

02,WebModelCommon:這層作為UI與領域邏輯的中間層,它的充當了橋梁、篩選、過濾和驗證的作用。它主要包括兩個工程,WebHelper主要提供給UI一些常用操作。WebLogic主要對UI與領域邏輯的數據進行轉換、篩選、驗證及過濾操作。

03,Business Logic:Domain Model (Data Model Layer)始終是應用程序的核心,必須投入大量精力,按照面向對象的分析和設計 (OOAD) 最佳做法進行設計同時按照OOP進行開發。

04,FrameWork:主要包括數據訪問框架、通用權限框架、異常和日志處理框架、IOC框架、AOP框架等基礎或常用功能。

05,SOA:這一層不是必須的,根據項目的具體情況進行取舍,如果業務比較復雜且交互項目繁多,那么SOA可以減輕我們的負擔;如果業務比較單一且相對簡單,就可以直接調用或者使用Web Service/Remoting/WCF作為通信框架即可。在實施SOA的過程中,可以自己使用WCF+WF搭建一個小型輕量級的SOA框架,也可以使用諸如Biztalk等軟件。

06,Reference:這里主要包括第三方的框架和組件項目,把這些文件分門別類地集中放在此目錄下。

07,Solution Items:項目的規范、流程、重要文件等。

08,Test:這里主要放置測試需要的一些信息,如測試版本、測試文檔等。

09,Publish:這個文件夾主要放置發布的版本。

作者的獲獎感言:比較關心有沒有獎品? 其實這個架構比較復雜一點(考慮到經常擴展和升級),如果小項目,就沒有必要這么折騰了。當時是支持多國家、多設備,比如同樣的項目可以在新加坡和美國根據IP的不同來自動尋址訪問,同時根據設備的不同而又有兩套路徑,手機用戶導航到手機網站頁面,PC用戶就到正常頁面。關於數據訪問層,有一個適配器,可以通過配置選擇ORM(自己寫的一套類庫,封裝在Framework里面)還是經典方式(SQL和存儲過程等全部單獨寫在XML文件里面,通過讀取XML文件進行調用,這樣維護和版本升級比較方便,同時為了降低系統的負載同時提高用戶的響應能力,我們采用了MSMQ和SSB來組織消息隊列)。另外數據層都有Mock data for testing,這樣就能保證項目擴展和升級造成的相互依賴而耗費過多的時間和精力。如果有時間,可以寫一篇文章出來大家探討!

回復感言:

獎品是必須的,針對此架構寫一篇詳細的文章,並附上源碼。

小項目確實沒必要搞這么復雜,可以參考帖子里的“土鱉實戰派”,那個分層我覺得就挺實在的。

Mock data for testing是個好辦法,有空介紹些好的Mock框架。


 最佳吐槽獎: [秦時明月] !!!

他只在評論里淡淡的回復了一句:“其實我只想說一點:大家都亂了.”。輕輕的來,不留一片架子。不過弦哥是不會放過他的......

於是乎弦哥到他的博客http://www.cnblogs.com/humble/里搜刮了一番,發現了他其實也有架子,“Moon.ORM”,“Qin.Data”(和秦時明月這個名字遙相呼應,文藝青年哈)......

其實我想說的是, 無論是所謂“大道至簡”的秦時明月,還是主流的 聖殿騎士,單從技術實現來說可以說條條大路通羅馬...無所謂對錯...

但在現實中聖殿騎士的路子可以上的台面去企業做培訓,而秦時明月可能更多的是孤芳自賞,其中緣由,大家可以探討...

 


 

 陰溝翻船獎 Artech

作者描述:我在《WCF全面解析》中的一個實例的解決方法結構,基本思路是:先模塊(這里指粗粒度模塊,可以看成子系統)(兩個業務模塊:Products、Orders,一個非業務模塊:Infrastructure),后層次。 Products.BusinessEntity:提供的業務實體(Business Entity)類型的定義。一般來講,業務實體和數據契約是不同的,在這里為了簡單起見,我們不僅僅將二者合一,還將業務實體作為ASP.NET MVC的Model使用; Products.DataAccess:數據訪問層,在這里單純地提供對數據庫的訪問了。該項目具有針對Products.BusinessEntity的項目引用; Products.BusinessComponent:也可以稱為業務邏輯層,真正的業務邏輯實現 在這里。該項目具有針對Products.BusinessEntity和Products.DataAccess的項目引用; Products.Service.Interface:WCF服務的契約接口定義在這里。該項目具有針對Products.BusinessEntity的項目引用; Products.Service:用於定義實現了上述契約接口的服務。該項目具有針對Products.Service.Interface 、Products.BusinessEntity和Products.BusinessComponent的項目引用; Products:為本模塊提供基本的功能,不僅僅包含對服務的調用,也包括一些必要的邏輯處理。該項目具有針對Products.BusinessEntity、Products.Service.Interface和Products.Interface的項目引用; Products.Interface:模塊提供給其他模塊的服務接口。該項目具有針對Products.BusinessEntity的項目引用。
 
點評:Artech算是園子里的大佬,貌似還出了書,不過發的這個架子有點出乎我意料,存在有一些值得商榷的問題:
1.從架子中的命名和大體結構明顯看出是走的DDD,在DDD中數據訪問的具體實現(就是夾子里的DataAccess)應該是放在基礎設施層(就是夾子里的Infrastructure),而Artech卻貌似只把Infrastructure作為了"非功能性需求"的Framework去用。並把Infrastructure叫“非業務模塊”,顯得有些外行....
2.Products.BusinessComponent業務邏輯層 直接引用了Products.DataAccess,這也是個嚴重的問題,如果DataAccess是沒有接口的,那么業務邏輯層依賴數據訪問層,在DDD和馬丁大叔的企業架構設計中,是一個反模式!!!,如果DataAccess里有接口,那么,DataAccess的接口應該是放在業務邏輯層的,然后通過依賴反轉去用,而DataAccess的具體實現是放在Infrastructure里的。
3.如果沒有用WCF,那么我認可可以省略掉DTO,但架子里上的WCF,還把DTO和PO合二為一,這個我非常不贊同。
4.Products層和Products.BusinessComponent層邊界不清晰,按Artech描述 ,兩個層里都可以放業務邏輯,但描述的模棱兩塊。而且基本可以看出Products.BusinessEntity又還是失血模型,這個設計完全讓人摸不着頭腦。Products層我猜是有點DDD中Application層的意思,但Artech明顯做的不對。
總之我感覺這個架子,裝的成分比較大,思路十分不清晰,命名很不規范,有失水准。
 
作者的獲獎感言:謝謝給我這個獎:) 1. 我的這個結構主要考慮的是模塊化,而不是層次化。或者在模塊的基礎上划分層次。 2. 模塊是以功能為主,模塊封裝業務功能和非業務功能。我主張在模塊級別對外提供服務,而不是層次上對外提供服務。 3、層次是模塊為了實現自身功能而進行的層次划分,所以沒有必要為每一個層次定義接口。DataAccess提供接口的一個很大的目的在於隔離數據存儲,是對多種數據存儲方式的支持。實際上很多類似與DbHelper就能夠提供這樣的功能。所以我很不喜歡為DataAccess定義接口,雖然PetShop是這樣做的,很多項目也是這樣做的,我依然覺得很丑。 4、接口是是契約,是“服務”的接口,只有在對外提供服務的情況下需要定義接口。而一個模塊為另一個模塊提供服務,才需要定義接口。 5、由於采用了WCF,我們采用了SO的 設計,即在通過WCF服務的方式提供一種理想的功能共享的粒度,而Business是實現服務的方式,它和Service之間不需要太強的松耦合,不要忘了Service采用暴露在外的,並且采用Service Contract的方式進行服務消費的。 6、...
 
回復感言:
1.搭架子的核心是層次的划分,功能模塊(包)的划分並不是關鍵;
2.業務邏輯層如果對存儲層(DataAccess)有依賴,是無法達到隔離數據存儲的目的的。不給存儲層定義接口並采用依賴反轉技術,是無法去掉業務邏輯層對存儲層的依賴的,petshop是垃圾不做討論;
3.一個模塊的自我實現和對外接口的設計沒有問題,但和業務邏輯無關,而是很薄的一個接口;
4.真正實現SOA的粗粒度服務,在自己的架子級別其實是無法實現的,更多的是靠大廠商SOA的中間件產品。用了WCF就叫SOA啦?
 
另:感謝Artech在WCF方面的貢獻,話說我當年看WCF還費勁呢,也是看了你的帖子才豁然開朗。

 

我先來拋磚引玉:

傳說中的弦哥:

tips:

1."解決方案文件夾"能幫助你很好的規划項目結構

2.通過對"解決方案文件夾"前面加數字1,2,3,4....,能讓項目按你想要的順序排序

3.公司名.項目名.包名.架構名的命名空間 命名約定能讓你的項目結構更清晰

4.分項目的多少還是要根據項目具體情況和架構設計,分太多編譯速度慢不說,其實用起來也麻煩

 


 

一晴 :

點評:一個比較簡單的博客網站,用的是MVC,命名啥的還是比較規范的。

建議:可以把Controller和Model從網站項目中提出來

 


 

 xu_happy_you :

點評:典型的Petshop控,BLL+DAL+MODEL+網站 的三層架構,通過工廠模式來調用DAL

建議:可以進一步嘗試DDD,並用DI依賴注入代替工廠模式

 


 

微軟根據DDD架構做的一個分層示范項目,NLayerAppV2:

下載網址:http://microsoftnlayerapp.codeplex.com/workitem/6687

 


 

微軟的一個CRM項目:

下載網址:http://orchard.codeplex.com/

點評:尼瑪這分的太多了............

 


 

.Net下大名鼎鼎的CMS  ,DotNetNuke(DNN):

下載網址:http://www.dotnetnuke.com/

點評:大部分我覺得挺好的,划分合理,結構清晰,就是“Providers”里面搞那么多”解決方案文件夾“搞毛啊!!!

 


 

臭名昭著的PetShop4.0:

點評:這些年來毒害了不少無知菜鳥,成就了不少裝X磚家.....人家拿來和java測效率的項目,你們拿來研究架構?

 


 

 一線碼農 :

點評:此碼農初窺門徑,命名規范,結構合理清晰,.Test是亮點,說明已經上了DDT,值得表揚,不過說確實分的有點太細了...

建議:“ZhuangHuang”這個拼音立馬把檔次降低了,建議改成英文,裝X!!!懂不!!!裝潢....地可兒瑞特..decorate

 


  Jaws:

點評:小寫和縮寫的命名方式看上去有點小清新的味道,比較像java那邊的習慣,說!你是不是那邊來的細作!!

建議:CSS,JS,JSON這種有必要都分成單獨的項目嗎?搞的和DNN一樣....


  道法自然

點評:從各方面看,無可挑剔,相當專業。基於Plugin的設計很考驗功力...........你是來砸場子的嗎?!!!

建議:給出源碼供廣大童鞋學習...


  魂淡

點評:從用英文的Visual Studio可以看出此人比我還能裝...,采用WCF實現分布式架構,命名准確專業,結構清晰合理。

難能可貴的是形式上沒有一點照貓畫虎的痕跡,但又處處體現出設計和模式的思想。鑒定為高手..

建議:你丫簽出那么多項目,別人想加文件咋整!!!


  劉海川

點評:照貓畫虎,乏善可陳

建議:多向樓上那位學習...從用英文Visual Studio開始!!!~~~


  kiler :

點評:土鱉實戰派!!公用類+業務邏輯+數據庫訪問+實體+網站。分層目的明確,表達直截了當,沒有絲毫多余的設計和矯揉造作的命名。

建議:實戰之余也可多看看一些經典的設計和架構理論。


 

雙擊

點評:做網站的屌絲,貼架子還不忘發廣告....,比較好奇Component里都有些什么東東

項目網址:http://www.jielongdaquan.com/


 柳柳英俠 :

點評:命名方面有些Petshop的遺風,但又有一些比較潮的設計思想。

建議:接口單獨放一層值得商榷,去看看馬丁大叔的依賴反轉,並深入理解。

   對於Model方面分了 PO,ViewModel和DTO,是否有設計過渡之嫌?

 


 林之空間:

點評:傍着Camstar的高帥富,DesignerClient在手,其他的都是浮雲..........


 園子里阿不同學:

點評:從架子看,功力扎實,設計老道。但並不潮.....

 


 

聖殿騎士

01,User Interface即UI層:該層作為數據輸入和展示的界面,是與用戶交互的有效途徑,所以它起着至關重要的作用。往往給人第一印象的就是UI層,在設計的時候也要根據不同的技術或者不同的要求進行斟酌。通常可以把UI分為B/S UI、C/S UI以及WEB服務。在這里就是我們的ASP.NET項目。

02,WebModelCommon:這層作為UI與領域邏輯的中間層,它的充當了橋梁、篩選、過濾和驗證的作用。它主要包括兩個工程,WebHelper主要提供給UI一些常用操作。WebLogic主要對UI與領域邏輯的數據進行轉換、篩選、驗證及過濾操作。

03,Business Logic:Domain Model (Data Model Layer)始終是應用程序的核心,必須投入大量精力,按照面向對象的分析和設計 (OOAD) 最佳做法進行設計同時按照OOP進行開發。

04,FrameWork:主要包括數據訪問框架、通用權限框架、異常和日志處理框架、IOC框架、AOP框架等基礎或常用功能。

05,SOA:這一層不是必須的,根據項目的具體情況進行取舍,如果業務比較復雜且交互項目繁多,那么SOA可以減輕我們的負擔;如果業務比較單一且相對簡單,就可以直接調用或者使用Web Service/Remoting/WCF作為通信框架即可。在實施SOA的過程中,可以自己使用WCF+WF搭建一個小型輕量級的SOA框架,也可以使用諸如Biztalk等軟件。

06,Reference:這里主要包括第三方的框架和組件項目,把這些文件分門別類地集中放在此目錄下。

07,Solution Items:項目的規范、流程、重要文件等。

08,Test:這里主要放置測試需要的一些信息,如測試版本、測試文檔等。

09,Publish:這個文件夾主要放置發布的版本。

點評:老油條了,沒啥好說的....分層的描述很准確。

特別是WebModel(ViewModel)的理解和描述很到位,避免了搞ViewModel的設計過渡之嫌。如果你有設計ViewModel的話.......

詳細學習地址:http://www.cnblogs.com/KnightsWarrior/archive/2010/12/09/1900832.html

建議:把FrameWork給大伙開開源..........


 Artech

作者描述:我在《WCF全面解析》中的一個實例的解決方法結構,基本思路是:先模塊(這里指粗粒度模塊,可以看成子系統)(兩個業務模塊:Products、Orders,一個非業務模塊:Infrastructure),后層次。 Products.BusinessEntity:提供的業務實體(Business Entity)類型的定義。一般來講,業務實體和數據契約是不同的,在這里為了簡單起見,我們不僅僅將二者合一,還將業務實體作為ASP.NET MVC的Model使用; Products.DataAccess:數據訪問層,在這里單純地提供對數據庫的訪問了。該項目具有針對Products.BusinessEntity的項目引用; Products.BusinessComponent:也可以稱為業務邏輯層,真正的業務邏輯實現 在這里。該項目具有針對Products.BusinessEntity和Products.DataAccess的項目引用; Products.Service.Interface:WCF服務的契約接口定義在這里。該項目具有針對Products.BusinessEntity的項目引用; Products.Service:用於定義實現了上述契約接口的服務。該項目具有針對Products.Service.Interface 、Products.BusinessEntity和Products.BusinessComponent的項目引用; Products:為本模塊提供基本的功能,不僅僅包含對服務的調用,也包括一些必要的邏輯處理。該項目具有針對Products.BusinessEntity、Products.Service.Interface和Products.Interface的項目引用; Products.Interface:模塊提供給其他模塊的服務接口。該項目具有針對Products.BusinessEntity的項目引用。
 
點評: Artech算是園子里的大佬,貌似還出了書,不過發的這個架子有點出乎我意料,存在有一些值得商榷的問題:
1.從架子中的命名和大體結構明顯看出是走的DDD,在DDD中數據訪問的具體實現(就是夾子里的DataAccess)應該是放在基礎設施層(就是夾子里的Infrastructure),而 Artech卻貌似只把Infrastructure作為了"非功能性需求"的Framework去用。並把Infrastructure叫“非業務模塊”,顯得有些外行....
2.Products.BusinessComponent業務邏輯層 直接引用了Products.DataAccess,這也是個嚴重的問題,如果DataAccess是沒有接口的,那么業務邏輯層依賴數據訪問層,在DDD和馬丁大叔的企業架構設計中,是一個反模式!!!,如果DataAccess里有接口,那么,DataAccess的接口應該是放在業務邏輯層的,然后通過依賴反轉去用,而DataAccess的具體實現是放在Infrastructure里的。
3.如果沒有用WCF,那么我認可可以省略掉DTO,但架子里上的WCF,還把DTO和PO合二為一,這個我非常不贊同。
4.Products層和Products.BusinessComponent層邊界不清晰,按 Artech描述 ,兩個層里都可以放業務邏輯,但描述的模棱兩塊。而且基本可以看出Products.BusinessEntity又還是失血模型,這個設計完全讓人摸不着頭腦。Products層我猜是有點DDD中Application層的意思,但 Artech明顯做的不對。
總之我感覺這個架子,裝的成分比較大,思路十分不清晰,命名很不規范,有失水准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM