1. 程式人生 > 其它 >DDD(領域驅動設計)思想解讀及優秀實踐|網盤XZ

DDD(領域驅動設計)思想解讀及優秀實踐|網盤XZ

DDD領域驅動設計介紹

高清 威❤ itspcool

領域驅動設計是一種解決業務複雜性的設計思想,不是一種標準規則的解決方法。在領域驅動設計理念上,各路大俠的觀點也是各有不同,能力有限、歡迎留言討論。

DDD是什麼
wiki釋義:

領域驅動設計(英語:Domain-driven design,縮寫 DDD)是一種通過將實現連線到持續進化的模型[1]來滿足複雜需求的軟體開發方法。領域驅動設計的前提是:

把專案的主要重點放在核心領域(core domain)和域邏輯
把複雜的設計放在有界域(bounded context)的模型上
發起一個創造性的合作之間的技術和域界專家以迭代地完善的概念模式,解決特定領域的問題
領域驅動設計是一種由域模型(牆裂推薦@阿白 的域模型系列)來驅動著系統設計的思想,不是通過儲存資料詞典(DB表字段、ES Mapper欄位等等)來驅動系統設計。領域模型是對業務模型的抽象,DDD是把業務模型翻譯成系統架構設計的一種方式。

DDD(領域驅動設計)思想解讀及優秀實踐-DDD 和微服務

DDD 的一個生命週期是這樣的:在設計和實現一個系統的時候,這個系統所要處理問題的領域專家和開發人員以一套統一語言進行協作,共同完成該領域模型的構建,在這個過程中,業務架構和系統架構等問題都得到了解決,之後將領域模型中關於系統架構的主體對映為實現程式碼,完成系統的實現落地。而用什麼方式去做領域模型的構建,方法是多樣的,Alberto 自己就為此發明了 Event Storming(事件風暴),併成為了一種經典的 DDD 落地模式。

DDD(領域驅動設計)思想解讀及優秀實踐-實戰

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.domain.repository.MerchantMapper">


    <select id="checkMerchantName" resultType="Integer">
        select count(0) from mechant
        where mechant_name=#{merchantName}
        <if test="exclude != null">
            and mechant_id not in
            <foreach collection="exclude" item="id" index="index" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </if>
    </select>

</mapper>
package com.github.application.service;

import com.github.domain.entity.Merchant;
import com.github.infrastructure.base.resp.RespBody;
import com.github.interfaces.dto.AddStoreDTO;
import com.github.interfaces.dto.MerchantComeInDTO;

/**
 * @author EalenXie create on 2018/8/30 18:10.
 * 商戶領域 Application 層 , 此層規定本服務中 商戶領域 需要完成的任務和功能
 * 不包含任務業務規則或知識, 為領域物件 委託工作。
 * 以下為示例部分內容
 */
public interface MerchantService {
    /**
     * 獲取商戶資訊(獲取聚合根)
     *
     * @param merchantId 商戶Id
     */
    RespBody<Merchant> getMerchant(Long merchantId);

    /**
     * 檢查商戶名稱是否合法
     *
     * @param merchantName 商戶名稱
     * @param exclude      需要判斷排除掉的商戶Id 為空則無需排除(例如新增時無需排除,更新時排除自身)
     * @return 是否合法
     */
    boolean checkMerchantName(String merchantName, Long... exclude);

    /**
     * 商戶 入駐(即商戶在平臺註冊)
     */
    RespBody<Void> merchantComeIn(MerchantComeInDTO dto);

    /**
     * 商戶 新增門店(商戶可以新增一家或多家門店)
     */
    RespBody<Void> addStore(AddStoreDTO dto);


}