半DDD架構
這是個自己總結的架構,半領域驅動。
實際項目結構:

1. Sample.Web:表示層
2. Sample.App:應用程序層
3. Sample.Core:業務邏輯層
4. Sample.Impl:各個具體實現
5. Frameworks:常用組件圖
表示層代碼:

1. NewsApplication newsApp = new NewsApplication(this.contextUserId);
a. new一個ApplicationLayer的News對象,傳入當前用戶ID
2. PostNewsRequest request = GetUserInput();
a. 根據用戶的輸入,生成Request對象(如同消息一樣,分Request/Response2個)
3. PostNewsResponse response= newsApp.PostNews(request);
a. 傳入request對象,執行函數,返回response對象
4. newsApp.BindBrokenMessages2WebPageBindableFieldValidators(this);
a. 如果函數執行出現問題,在newsApp對象中有個屬性List<Message> BrokenRules, 里面存放着此次函數執行過程中出現的異常,BindBrokenMessages2WebPageBindableFieldValidators這個函數會根據這個BrokenRules列表往webpage中設置出錯表示信息
業務邏輯層代碼
業務邏輯層工程結構圖

NewsManager代碼

Post新聞業務方法代碼

建議業務方法中代碼塊的順序:
1. 清除異常消息列表
2. 調用驗證類來實現業務對象的有效性驗證
3. 執行非驗證類型業務邏輯
想要在業務邏輯中不強耦合具體外部類,需要使用接口。
在這個業務邏輯中使用了下面三個接口,定義如下:

要把某個具體實現了某接口的類注入到業務邏輯中,共有2種方式:構造函數注入和屬性注入,我們首選構造函數注入方式,代碼如下:

userId代表當前調用這個業務方法的用戶ID
BaseMgr類定義

BrokenMessageEnabled類定義(繼承這個class的類能夠記錄下所有的異常信息到BrokenRuleMessage List中)

實體定義

通過使用System.ComponentModel.DataAnnotations命名空間下的Attribute來自動化驗證特性(需要引用程序集 System.ComponentModel.DataAnnotations.dll)
如何驗證實體

左邊是業務邏輯層中進行驗證動作時所寫的代碼
右邊是具體驗證類,繼承在BaseValidator<NewsEntity>,是個范型類,里面的T就是上面定義的NewsEntity;在這個新的驗證類(PostNewsValidator)中,只有一個方法需要override,而且名稱為ValidateExtraRules,之所以命名為Extra,而沒有命名為Basic,是因為BaseValidator<NewsEntity>已經為我們進行了Basic的驗證(就是寫在NewsEntity中的那些Attribute);這里的ExtraRules是指那些需要較多運算的規則,比如:當Body中包含有ABC字符串時,Body可以任意輸入,或者驗證中需要使用到數據庫操作、文件操作等等依賴外部系統的、較復雜的規則
倉儲接口定義
這個倉儲可以簡單的認為是以前的DAL層
再拿上面說到的業務邏輯代碼作示范:

INewsRepository只有個空殼子

Insert方法哪里來的?如下:

添加、修改、刪除、獲取都已經定義了,所以如果只是調用普通操作就不需要額外定義方法了
但是如果需要使用到其他方法,比如:SearchUser(userName, encryptedPassword),那就要在INewsRepository中定義這個方法了
應用程序層代碼
作用
由於業務邏輯層中已經將所有外部系統操作定義成了接口形式,因此表示層要能使用業務邏輯方法就需要將實現了那些接口的具體實現類注入到業務邏輯操作類中,考慮到解耦以及代碼的封裝簡化目的,所以出現了應用程序層,由這個層來完成接口的注入。
BootStrap類
給各個接口關聯具體實現類(使用了開源工具StructureMap)
代碼如下:

此時,ObjectFactory.GetInstance<IEmailSender>()這句代碼就能返回SNF.EmailSenderProvider實例。
消息請求/回應
這里只的是一種消息模式,比如:PostNews這個,按照新的消息模式的話共分3步:
生成PostNews的Request消息
調用PostNews業務方法
接收PostNews業務方法返回的Response消息
表示層調用應用程序層的代碼如下:

NewsApplication說明

注意此時的構造函數只傳入一個userId代表當前操作的userId,具體外部具體實現類會在構造函數中通過StructureMap工具來獲得
PostNews方法已經換成了傳入Request參數、傳出Response對象的形式
在PostNews方法中,沒有業務邏輯,此時這個函數重點在於對象轉換、接口引用等裝配上的工作。
單元測試
需要針對業務邏輯層中的類進行單元測試
學習方向
DDD(Domain Driven Developing, 領域驅動編程)
單元測試的藝術
設計模式
分層、各層的作用
