Go-DDD: เทมเพลตการออกแบบที่ขับเคลื่อนด้วยโดเมนใน Golang
ยินดีต้อนรับสู่ go-ddd การใช้งานอ้างอิง/ที่เก็บแม่แบบแสดงให้เห็นถึงวิธีการออกแบบโดเมน (DDD) ใน Golang โครงการนี้มีจุดมุ่งหมายเพื่อช่วยให้นักพัฒนาและสถาปนิกเข้าใจโครงสร้าง DDD โดยเฉพาะอย่างยิ่งในบริบทของ GO และวิธีที่จะนำไปสู่การทำความสะอาดรหัสฐานที่ดีขึ้นและปรับขนาดได้มากขึ้น
ภาพรวม
การออกแบบที่ขับเคลื่อนด้วยโดเมนเป็นวิธีการและรูปแบบการออกแบบที่ใช้ในการสร้างซอฟต์แวร์องค์กรที่ซับซ้อนโดยเชื่อมต่อการใช้งานกับรูปแบบการพัฒนา go-ddd นำเสนอสิ่งนี้โดยการตั้งค่าตลาดอย่างง่ายที่ Sellers สามารถขาย Products ได้
ทำไมต้อง DDD?
- ภาษาที่แพร่หลาย : ส่งเสริมภาษาทั่วไประหว่างนักพัฒนาและผู้มีส่วนได้ส่วนเสีย
- การแยกตรรกะโดเมน: ตรรกะของ โดเมนแยกออกจากโครงสร้างพื้นฐานและเลเยอร์แอปพลิเคชันเพื่อส่งเสริมหลักการที่เป็นของแข็ง
- ความสามารถในการปรับขนาด : ช่วยให้การเปลี่ยนสถาปัตยกรรมของไมโครเซิร์ตง่ายขึ้น
โครงสร้างที่เก็บ

-
domain : หัวใจของซอฟต์แวร์ซึ่งเป็นตัวแทนของตรรกะทางธุรกิจและกฎ-
entities : วัตถุพื้นฐานภายในระบบของเราเช่น Product และ Seller มีตรรกะการตรวจสอบพื้นฐาน
-
application : มีการดำเนินการเฉพาะกรณีการใช้งานที่โต้ตอบกับเลเยอร์โดเมน -
infrastructure : รองรับเลเยอร์ที่สูงขึ้นด้วยความสามารถทางเทคนิคเช่นการเข้าถึงฐานข้อมูล-
db : การเข้าถึงฐานข้อมูลและรุ่น -
repositories : การใช้งานที่เป็นรูปธรรมของความต้องการการจัดเก็บของเรา
-
interface : เลเยอร์ภายนอกที่โต้ตอบกับโลกภายนอกเช่นจุดสิ้นสุด API-
api/rest : ตัวจัดการหรือคอนโทรลเลอร์สำหรับการจัดการคำขอและการตอบกลับ HTTP
หลักการเพิ่มเติม
- โดเมน
- ต้องไม่ขึ้นอยู่กับเลเยอร์อื่น ๆ
- จัดเตรียมโครงสร้างพื้นฐานที่มีอินเทอร์เฟซ แต่ต้องไม่เข้าถึงโครงสร้างพื้นฐาน
- ใช้ตรรกะและกฎทางธุรกิจ
- ดำเนินการตรวจสอบความถูกต้องของเอนทิตี หน่วยงานที่ผ่านการตรวจสอบจะถูกส่งผ่านไปยังชั้นโครงสร้างพื้นฐาน
- เลเยอร์โดเมนตั้งค่าเริ่มต้นของเอนทิตี (เช่น UUID สำหรับการประทับเวลา ID หรือการสร้าง) อย่าตั้งค่าเริ่มต้นในเลเยอร์โครงสร้างพื้นฐานหรือแม้แต่ฐานข้อมูล!
- อย่ารั่วไหลของวัตถุโดเมนไปยังโลกภายนอก
- แอปพลิเคชัน
- รหัสกาวระหว่างโดเมนและชั้นโครงสร้างพื้นฐาน
- โครงสร้างพื้นฐาน
- ที่เก็บมีหน้าที่แปลเอนทิตีโดเมนเป็นโมเดลฐานข้อมูลและเรียกคืน ไม่มีการดำเนินการทางธุรกิจที่นี่
- ใช้อินเทอร์เฟซที่กำหนดโดยเลเยอร์โดเมน
- ใช้ตรรกะการคงอยู่เช่นการเข้าถึงฐานข้อมูล Postgres หรือ MySQL
- เมื่อเขียนไปยังที่เก็บข้อมูลอ่านข้อมูลที่เป็นลายลักษณ์อักษรก่อนที่จะส่งคืน สิ่งนี้ทำให้มั่นใจได้ว่าข้อมูลถูกเขียนอย่างถูกต้อง
แนวทางปฏิบัติที่ดีที่สุด
- อย่าส่งคืนเอนทิตีที่ผ่านการตรวจสอบจากวิธีการอ่านในที่เก็บ ให้ส่งคืนประเภทเอนทิตีโดเมนโดยตรง
- การตรวจสอบอาจเปลี่ยนแปลงในอนาคตและคุณไม่ต้องการเปลี่ยนข้อมูลทั้งหมดในฐานข้อมูลของคุณ
- มิฉะนั้นคุณจะไม่สามารถอ่านข้อมูลจากฐานข้อมูลที่เขียนด้วยตรรกะการตรวจสอบความถูกต้องที่แตกต่างกัน
- อย่าใส่ค่าเริ่มต้น (เช่นการประทับเวลาปัจจุบันหรือ ID) ในฐานข้อมูล ตั้งค่าไว้ในเลเยอร์โดเมน (โรงงาน!) ด้วยเหตุผลหลายประการ:
- มันค่อนข้างอันตรายที่จะมีสองแหล่งของความจริง
- ง่ายกว่าที่จะทดสอบเลเยอร์โดเมน
- ฐานข้อมูลสามารถเปลี่ยนได้และคุณไม่ต้องการเปลี่ยนค่าเริ่มต้นทั้งหมดของคุณ
- อ่านเอนทิตีเสมอหลังจากเขียนในชั้นโครงสร้างพื้นฐาน
- สิ่งนี้ทำให้มั่นใจได้ว่าข้อมูลถูกเขียนอย่างถูกต้องและเราไม่เคยทำงานกับข้อมูลเก่า
-
find vs get :-
find วิธีการสามารถส่งคืนโมฆะหรือรายการที่ว่างเปล่า -
get วิธีการจะต้องส่งคืนค่า หากไม่พบค่าให้โยนข้อผิดพลาด
- การลบ: ใช้การลบที่อ่อนนุ่มเสมอ สร้างคอลัมน์
deleted_at ในฐานข้อมูลของคุณและตั้งค่าเป็น TIMESTAMP ปัจจุบันเมื่อลบเอนทิตี ด้วยวิธีนี้คุณสามารถกู้คืนเอนทิตีได้หากจำเป็น
เริ่มต้น
- โคลนที่เก็บนี้:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
ผลงาน
ยินดีต้อนรับการมีส่วนร่วมปัญหาและคำขอคุณสมบัติ! อย่าลังเลที่จะตรวจสอบหน้าปัญหา
ใบอนุญาต
แจกจ่ายภายใต้ใบอนุญาต MIT ดูใบอนุญาตสำหรับข้อมูลเพิ่มเติม