DDD實戰進階第一波(四):開發一般業務的大健康行業直銷系統(搭建支持DDD的輕量級框架三)


上一篇文章我們講了經典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實戰進階視頻請關注微信公眾號:

 


免責聲明!

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



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