ใน DDD บริการโดเมนเป็นเพียงรูปแบบซุ้มและ / หรือคนกลาง?


13

ในการออกแบบการขับเคลื่อนโดเมน Domain Layer สามารถมีบริการ (ดั้งเดิม) หลายอย่าง ตัวอย่างเช่นสำหรับโดเมนผู้ใช้เราอาจมี:

  • UserFactory ที่สร้างวัตถุผู้ใช้ด้วยวิธีที่ต่างกัน
  • UserRepository ซึ่งรับผิดชอบในการโต้ตอบกับ Persistence Services ในชั้นโครงสร้างพื้นฐาน

UserService ใน Domain Layer นั้นเป็นเพียงแค่ผู้ไกล่เกลี่ยและ / หรือส่วนหน้าของบริการทั้งสองและโครงสร้างพื้นฐานของเลเยอร์หรือมีมากกว่านั้นหรือไม่



ฉันได้อ่าน Level Gorodinski โพสต์ข้อตกลงอย่างมากไม่เคยเห็นลิงก์ที่สองเลย เยี่ยมมากอ่านสัมผัสกับประเด็นสำคัญบางอย่างอย่างแน่นอน!
e_i_pi

คำตอบ:


11

Domain services อธิบายได้ดีที่สุดจากสิ่งที่ไม่ได้:

  • พวกเขาไม่ใช่EntitiesหรือAggregate roots
  • พวกเขาจะไม่ Value objects
  • รู้โดเมนดำเนินการที่ไม่เป็นธรรมชาติพอดีเพียงหนึ่ง Entityหรืออย่างใดอย่างหนึ่ง Value object

ตัวอย่างของการDomain serviceเป็นSaga/Process managerมันพิกัดกระบวนการระยะยาวที่เกี่ยวข้องกับหลาย ๆที่เป็นไปได้จากที่แตกต่างกันAggregate rootsBounded contexts

ที่ถูกกล่าวว่าสิ่งที่เป็นDomain serviceและวิธีการใช้งานเป็นสองสิ่งที่มุมฉาก

UserService ใน Domain Layer นั้นเป็นเพียงแค่ผู้ไกล่เกลี่ยและ / หรือส่วนหน้าของบริการทั้งสองและโครงสร้างพื้นฐานของเลเยอร์หรือมีมากกว่านั้นหรือไม่

บริการโดเมนบางอย่างเช่นUserRepository(ประกอบด้วยส่วนต่อประสานที่กำหนดไว้ในDomain layerและการนำไปปฏิบัติอย่างเป็นรูปธรรมในInfrastructure layer) สามารถนำมาใช้โดยใช้Facadeรูปแบบการออกแบบ บริการโดเมนอื่น ๆ ไม่ใช่

ไม่มีกฎที่เข้มงวดเกี่ยวกับวิธีการใช้งานนอกเหนือจากกฎสำคัญที่ว่าDomain layerจะต้องไม่ขึ้นอยู่กับเลเยอร์อื่น ๆ (และSOLID )


ขอบคุณฉันคิดว่าในที่สุดฉันก็เข้าใจ Domain Layer นอกเหนือจากการเก็บวัตถุข้อมูล (รวม, เอนทิตีและวัตถุมูลค่า) แล้วมันยังมีกฎเกณฑ์ทางธุรกิจด้วย บริการโดเมนกำหนดสิ่งที่คุณสามารถทำได้กับวัตถุข้อมูลโดเมน แต่ไม่มีความรู้ว่าการทำงานเหล่านั้นทำงานภายในอย่างไร
e_i_pi

1
@e_i_pi กฎเกณฑ์ทางธุรกิจได้รับการคุ้มครองโดย Aggregates และเอนทิตีซ้อน บริการโดเมนไม่มีส่วนเกี่ยวข้องในเรื่องนี้
Constantin Galbenu

1
@e_i_pi โดยที่การดำเนินการเกี่ยวข้องกับการรวมมากกว่าหนึ่งรายการ ตัวอย่างเช่นเมื่อกำหนดรายชื่อ BankAccounts (รวม) ของบุคคล (รวมอีกครั้ง) บริการโดเมนจะคำนวณยอดรวมของบัญชีเหล่านั้น
Constantin Galbenu

1
@e_i_pi: ฉันคิดว่าคุณมีความเข้าใจผิดเล็กน้อย ดังนั้น Domain Layer ทั้งหมดเป็นรูปแบบซอฟต์แวร์ของโดเมนของคุณ คุณพูดว่า - "พร้อมกับการเก็บวัตถุข้อมูล (มวลรวม, หน่วยงานและวัตถุมูลค่า)" - สิ่งเหล่านี้ไม่ใช่ "วัตถุข้อมูล" ในแง่ที่ว่าพวกเขาเพิ่งเก็บข้อมูล เหล่านี้ใช้กฎโดเมนจริงพวกเขากำหนดพฤติกรรม ตอนนี้Domain ServicesตามDDD Book โดย E. Evansเป็นแง่มุมของโดเมนที่ไม่สอดคล้องกับวัตถุ (เอนทิตีหรือวัตถุค่า)
Filip Milovanović

1
ค่อนข้างบริการโดเมน "ถูกกำหนดไว้อย่างแท้จริงในแง่ของสิ่งที่มันสามารถทำเพื่อลูกค้า" ที่กำหนดไว้ในแง่ขององค์ประกอบอื่น ๆ ของรูปแบบโดเมน (ดังนั้นจึงประสานองค์ประกอบเหล่านั้นอย่างใดและบังคับใช้กฎโดเมนที่ควบคุมการกำกับที่ บริการโดเมนนั้นไม่มีสัญชาติ นอกจากนี้ยังมีแนวคิดของApplication Servicesซึ่งอยู่ในเลเยอร์ระดับที่สูงขึ้นและใช้เรื่องราวของผู้ใช้หรือใช้เคสเท่ากันโดยทำหน้าที่เป็นอินเทอร์เฟซสำหรับเลเยอร์โดเมน โปรดทราบว่าอัตราส่วนของออบเจ็กต์กับบริการจะแตกต่างกันไปขึ้นอยู่กับโดเมนที่ทำโมเดล
Filip Milovanović

1

ผมเห็นการบริการใน DDD เป็นผลมาจากการพึ่งพาการผกผัน

หากคุณต้องใช้การอ้างอิงแบบ "ธรรมดา" รหัสโดเมนของคุณจะเรียกฐานข้อมูลเพื่อบันทึกหรือสอบถามเอนทิตีหรือโรงงานที่สร้างเอนทิตีที่เชื่อมโยงกับฐานข้อมูลหรือบริการภายนอกหรือรหัสโครงสร้างพื้นฐานอื่น ๆ

แต่นั่นไม่ใช่รหัสโดเมนที่ควรจะเป็น รหัสโดเมนไม่ควรขึ้นอยู่กับรหัสโครงสร้างพื้นฐาน เนื่องจากการพึ่งพานี้ทำให้ยากต่อการทดสอบและอาจนำมาใช้ซ้ำ ซึ่งเป็นสาเหตุที่คุณกลับด้านการพึ่งพานั้น คุณสร้างรหัสโครงสร้างพื้นฐานขึ้นอยู่กับรหัสโดเมน และในการทำเช่นนั้นคุณจะต้องแนะนำสิ่งที่เป็นนามธรรม สิ่งที่เป็นนามธรรมซึ่งกำหนดลักษณะการทำงานของรหัสโดเมนที่คาดว่าจะนำมาใช้โดยโครงสร้างพื้นฐาน

และบริการใน DDD นั้นเป็นสิ่งที่เป็นนามธรรม ในกรณีส่วนใหญ่สำหรับรหัสโดเมนบริการเหล่านั้นควรจะเป็นอินเตอร์เฟซธรรมดา และการดำเนินการควรอยู่ในรหัสโครงสร้างพื้นฐานซึ่งมีการพึ่งพาอินเทอร์เฟซเหล่านั้น


ขอบคุณสำหรับคำตอบของคุณคำตอบทั้งสองได้ให้ "aha!" ขณะ ฉันคิดว่าไม่มีคำตอบของคุณฉันจะไม่เข้าใจแนวคิดทั้งหมด แต่ฉันชอบคำตอบของคอนสแตนตินเป็นตัวบ่งชี้สำหรับผู้อ่านในอนาคต
e_i_pi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.