上一篇文章我們講了經典DDD架構對比傳統三層架構的優勢,以及經典DDD架構每一層的職責後,本篇文章將介紹基礎結構層中支持DDD的輕量級框架的主要代碼。 這裡需要說明的是,DDD輕量級框架能夠體現DDD的思想即可,沒必要做得很重,你也可以根據理解,自己實現支持DDD的框架。 1.實體、聚合根與值對象的 ...
上一篇文章我們講了經典DDD架構對比傳統三層架構的優勢,以及經典DDD架構每一層的職責後,本篇文章將介紹基礎結構層中支持DDD的輕量級框架的主要代碼。
這裡需要說明的是,DDD輕量級框架能夠體現DDD的思想即可,沒必要做得很重,你也可以根據理解,自己實現支持DDD的框架。
1.實體、聚合根與值對象的頂層體現
實體頂層定義:
public interface IEntity { string Code { get; set; } Guid Id { get; set; } }
Id是一個未來存儲到資料庫表中的技術主鍵,Code是領域對象的唯一業務標識符。你也可以擴展這個介面,定義兩個實體比較介面(未來實現就是比較兩個實體如果Code一致,則代表兩個實體相等)。
聚合根頂層定義:
public interface IAggregationRoot:IEntity { }
聚合根介面就是從實體介面繼承,只是未來的用法可以在倉儲中定義持久化時的領域對象必須從這個介面或繼承了這個介面的抽象類繼承下來的。
值對象頂層定義:
public interface IValueObject { Guid Id { get; set; } }
值對象介面只需要保留一個技術主鍵即可,它沒有業務標識符。在資料庫中,值對象可能作為單獨表存儲,也可以作為實體的一部分存儲。你也可以擴展這個介面,定義兩個值對象比較介面(未來實現
就是比較兩個值對象如果所有屬性值一致,則代表兩個值對象相等)。
工作單元頂層定義:
public interface IUnitOfWork { void Commit(); }
工作單元介面就定義了一個提交方法,在具體實現時,其實就是對應的EF Core的整個聚合的事務提交方法。
倉儲介面頂層定義:
public interface IRepository:IUnitOfWork,IDisposable { }
倉儲介面從工作單元介面與資源釋放介面繼承,為未來的數據訪問框架和可替換性提供頂層約束。
EF Core頂層倉儲持久化實現:
public class EFCoreRepository : IRepository { private readonly DbContext context; public EFCoreRepository(DbContext context) { this.context = context; } public void Commit() { try { context.SaveChanges(); } catch(Exception error) { throw error; } } public void Dispose() { context.Dispose(); } }
從上述代碼中可以看到,主要實現了倉儲介面的Commit方法,其實就是使用了EF Core的DbContext數據訪問上下文類的SaveChanges()事務提交方法,應用服務層的用例就可以獲取到某個聚合根的當前狀態,然後調用倉儲介面的Commit方法,實現了整個聚合所有對象的一次性事務提交。
2.常用工具類的實現
我們還應該定義另一個項目,這個項目是整個系統都需要使用到的工具,其中至少應該包括Asp.net Core Json配置文件的讀,Json序列化與反序列化,加密,依賴註入,返回給前端的對象格式定義等,這裡
先列出幾個需要的,其他的在後面具體案例中在補充。
Asp.net Core Json配置文件讀取:
Json配置文件會存儲我們的一些配置信息,比如資料庫連接字元串,微信AppId與AppSecure等,所以需要有功能支持Json配置文件的Key到Value的讀取
public class AppSetting { private static IConfigurationSection appsections = null; public static void SetAppSetting(IConfigurationSection section) { appsections = section; } public static string GetAppSetting(string key) { string str = ""; if (appsections.GetSection(key) != null) { str = appsections.GetSection(key).Value; } return str; } }
返回前端的對象格式定義:
我們的應用服務層將返回WebApi介面一定的數據格式,WebApi介面也會將這個數據返回給前端,前端拿到後就會做相應的處理。
public class ResultEntity<T> { public bool IsSuccess { get; set; } public string Msg { get; set; } public T Data { get; set; } public int ErrorCode { get; set; } public int Count { get; set; } }
public class BaseAppSrv { protected ResultEntity<T> GetResultEntity<T>(T vobj,string msg="未成功獲取到對象",int errorcode = 0) { var ueresult = new ResultEntity<T>(); var issuccess = true; if(vobj is int && Convert.ToInt32(vobj) <= 0) { issuccess = false; } else if(vobj is bool && !Convert.ToBoolean(vobj)) { issuccess = false; } else if(vobj is string && string.IsNullOrEmpty(Convert.ToString(vobj))) { issuccess = false; } if (!issuccess) { ueresult.Msg = msg; ueresult.ErrorCode = 200; } ueresult.IsSuccess = issuccess; ueresult.Data = vobj; return ueresult; } }
未來所有的用例都將從BaseAppSrv繼承,最終返回的格式都是ResultEntity<T>。
好了,基本的框架搭建好了,下一章就可以直接進入案例,看案例中如何通過DDD思想進行設計,並通過經典DDD架構與DDD輕量級框架進行實際業務系統的代碼編寫。
QQ討論群:309287205
DDD實戰進階視頻請關註微信公眾號: