DDD領域驅動設計初探(7):Web層的搭建

發表於2016-04-12

前言:好久沒更新部落格了,每天被該死的業務纏身,今天正好一個模組完成了,繼續來完善我們的程式碼。之前的六篇完成了領域層、應用層、以及基礎結構層的部分程式碼,這篇打算搭建下UI層的程式碼。

一、UI層介紹

在DDD裡面,UI層的設計也分為BS和CS,本篇還是以Web為例來說明。我們的Web採用的是MVC+bootstrap的架構。Table元件使用的是bootstrap table,之所以用它是因為它的API比較全,並且博主覺得它的風格適用於各種型別的裝置,無論是PC端還是手機端都都能很好的相容各種瀏覽器。

這裡還是貼出bootstrap API的相關地址。

Bootstrap中文網:http://www.bootcss.com/

Bootstrap Table Demo:http://issues.wenzhixin.net.cn/bootstrap-table/index.html

Bootstrap Table API:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/

Bootstrap Table原始碼:https://github.com/wenzhixin/bootstrap-table

Bootstrap DataPicker:http://www.bootcss.com/p/bootstrap-datetimepicker/

Bootstrap離線API

二、程式碼示例

上篇完成了WCF的設計程式碼,但是具體的業務邏輯的程式碼還沒有,我們先來實現具體業務的CURD程式碼。

1、WCF程式碼

1.1 WCF服務業務介面程式碼

1.2 WCF介面實現程式碼:

這裡要說明一點,在通過lamada表示式查詢的方法裡面為什麼不直接用Expression>這種型別,而要使用ExpressionNode這種型別的變數呢?

這是因為Expression不支援序列化,無法用於WCF資料的傳遞。ExpressionNode這個物件的使用需要新增Serialize.Linq這個dll的引用,還好有我們神奇的NuGet,讓我們再也不用去網上找一大堆的dll了。

我們公用的增刪改查封裝到了BaseService這個父類裡面。

1.3 BaseService程式碼

這個父類主要做了兩件事:一是MEF的初始化;二是通用增刪改查的實現。所有dto物件和領域model的對映都在這裡統一管理。

2、UI層程式碼

UI層裡面,為了更好分離程式碼,我們引入了介面程式設計的機制,引入了ESTM.Web.IBLL和ESTM.Web.BLL兩個專案,如圖:

為什麼要有這麼一個介面層?之前 MEF實現設計上的“鬆耦合”(終結篇:面向介面程式設計)這篇已經做過介紹,對面向介面程式設計不瞭解的朋友可以看看。

2.1 ESTM.Web.IBLL程式碼

這個dll主要定義介面規則。

2.2 ESTM.Web.BLL程式碼

這個dll用於實現ESTM.Web.IBLL裡面的介面方法

由於是採用的新增服務引用的方式引用的WCF服務,所以在這一層需要新增WCF服務的引用。在實現這部分程式碼的時候博主遇到過一個問題,在此和朋友們分享一下。由於在WCF服務的設計裡面用到了DTO物件,而在ESTM.Web.BLL這個專案裡面也要用到DTO,但是新增WCF服務引用的時候預設的是WCF服務裡面的DTO,而不是ESTM.Common.DtoModel這個專案的DTO物件,這樣就有問題了,每次如果我們需要改動下dto的內容,那麼我們就需要更新下服務引用。還好,微軟給我們選擇的機制,我們來看圖

這樣就能解決上面的問題了。

2.3 ESTM.Web程式碼

按照面向介面的機制,ESTM.Web專案是不需要新增ESTM.Web.BLL這個實現層專案引用的,通過MEF動態匯入ESTM.Web.BLL裡面的物件。我們來看程式碼:

View頁面

JS程式碼我們來看一個頁面就好了,其他頁面類似:

效果圖:

在做頁面資料更新的時候,博主又遇到一個問題:ObjectStateManager 中已存在具有同一鍵的物件。ObjectStateManager 無法跟蹤具有相同鍵的多個物件。在此還是記錄下解決方案:

在倉儲的公共實現類中將

改成

就可以了。

至此,從領域模型到Web前端的程式碼基本完成,可能很多程式碼並未完善,比如異常處理、資料驗證等。

DDD領域驅動設計初探系列文章:

相關文章