兩年前我在博客中發布了《EntityFramework之領域驅動設計實踐》系列文章,也得到了廣大讀者朋友的關注,在完成了系列文章的總結之后,也一直沒有這部分內容的更新了。現在,Entity Framework的穩定版(就是那個Stable的版本,不是Entity Framework 5的beta版本)4.3.1已經逐步應用到各種.NET項目中,為了演示Entity Framework 4.3.1 Code First編程模式以及其它的一些.NET技術在領域驅動設計實踐上的應用,我重新采用經典的分層架構(也就是類似Microsoft NLayerApp的區別於CQRS的架構)實現了一個案例程序:Byteart Retail。在這個案例中,倉儲的實現不再采用NHibernate,而是使用的Entity Framework 4.3.1 Code First。雖然這個案例較為完整地從各方面展示了.NET技術在企業級程序中的應用,但Entity Framework確實是其亮點之一,因此,我將這篇介紹這個案例的文章也編排在原來的EF系列文章中。
案例概述
Byteart Retail以筆記本電腦在線銷售業務為背景,展示了Microsoft.NET技術以及領域驅動設計理念在軟件設計、架構與實踐中的應用。在Byteart Retail之前,開源社區也有一些領域驅動設計的實踐案例,比如Microsoft Domain-Oriented NLayered Application Architecture、面向CQRS體系結構模式的Tiny Library CQRS等。與這些案例相比,Byteart Retail在領域驅動的實踐指導方面有一定的相似性和可比性,但它更注重Microsoft.NET技術與領域驅動設計相結合。比如,Byteart Retail案例對基於Entity Framework 4.3.1版本中Code First模式的倉儲實現進行了全方位的演示,這樣的Entity Framework倉儲設計,使得領域模型對象能夠完全設計為POCO對象而不需要依賴任何其它技術框架,因此,在對倉儲的選擇和使用上,就能夠做到“無縫替換”。另一方面,領域模型的設計也更為考究,實體、值對象的設計、聚合的划分等,都與系統業務緊密結合,相對於其它的演示案例更為成熟。從實現的業務邏輯上看,Byteart Retail大致實現了以下功能:
- 筆記本電腦商品的瀏覽
- 客戶賬戶注冊和基本信息查詢與修改
- 筆記本電腦詳細信息查詢
- 客戶添加筆記本電腦商品到購物籃
- 購物籃商品項目管理
- 從購物籃創建銷售訂單
- 銷售訂單的確認與查詢
- 銷售訂單明細查詢
案例對以下.NET技術和開發技巧進行了演示:
- Microsoft Entity Framework 4.3.1 Code First
- ASP.NET MVC 3
- WCF
- Microsoft Patterns & Practices Unity Application Block
- 使用AutoMapper實現DTO與領域對象映射
- T4自動化代碼生成
案例下載
請【單擊此處】下載本案例的所有源代碼和Visual Studio 2010的解決方案文件。
系統需求
開發環境:Visual Studio 2010 Professional/Ultimate with SP1,ASP.NET MVC3。其它的程序集引用都在壓縮包的packages目錄下,因此讀者無需上網下載安裝其它組件。
安裝部署
數據庫
Byteart Retail采用Microsoft SQL Server 2008作為后台數據庫。首先,修改ByteartRetail.Services項目下的web.config文件,對數據庫鏈接字符串進行配置:
然后,按照下面“程序啟動”部分的描述,啟動ByteartRetail.Web項目,此時Entity Framework會根據上面的連接字符串創建一個名為ByteartRetail的數據庫。
最后,打開SQL Server Management Studio,執行壓縮包中SQL目錄下的ByteartRetailData.sql文件即可將所需的測試數據導入ByteartRetail數據庫中。
說明:這種數據庫的部署和初始化方式雖然能夠規避“Model compatibility cannot be checked because the database does not contain model metadata.”的錯誤,但仍然不是一個很理想的部署方式。在這里我們暫時采用這種方式讓案例先運行起來,以后我會找出一個更合理的辦法並對這部分內容進行更新。
程序啟動
使用Visual Studio打開解決方案並完成編譯,然后在ByteartRetail.Services項目中任選一個.svc文件點擊右鍵,並選擇View in Browser選項以啟動WCF Service;之后,直接運行ByteartRetail.Web項目,即可出現主界面。
設計概要
在此我先將部分設計的類圖貼出,以方便讀者朋友在查看源代碼的過程中參閱。
領域模型
基於Entity Framework的倉儲設計(省略屬性與方法)
規約設計
企業應用架構模式參考
本案例大致涉及到了以下企業級應用架構模式,也一並列舉於此,供讀者朋友們參考,也可以作為學習《Patterns of Enterprise Application Architecture》、《Core J2EE Patterns》等書籍的參考。
- Domain Model
- Unit Of Work
- Repository
- Data Transfer Object
- Client Session State
- Layer Supertype
- Separated Interface
- Value Object
- Business Delegate
- Service Locator
- Transfer Object Assembler
總結
熱烈歡迎愛好Microsoft.NET技術以及領域驅動設計的讀者朋友對本案例進行深入討論。有疑問或建議請直接留言回復。