วิธีเลือกระหว่างการใช้กิจกรรมโดเมนหรือปล่อยให้แอปพลิเคชันเลเยอร์จัดการทุกอย่าง


27

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

สมมติว่าคำขอของผู้ใช้มาในเลเยอร์บริการแอพพลิเคชัน ตรรกะทางธุรกิจสำหรับคำขอนั้นคือ (ด้วยเหตุผลใดก็ตาม) ที่แยกออกเป็นวิธีการในเอนทิตีและวิธีการในบริการโดเมน ฉันจะเรียกวิธีการเหล่านั้นได้อย่างไร

ตัวเลือกที่ฉันรวบรวมได้มีดังนี้:

  • ให้บริการแอปพลิเคชันโทรทั้งสองวิธี
  • ใช้วิธีการฉีด / ส่งสองครั้งเพื่อฉีดบริการโดเมนลงในเอนทิตีปล่อยให้เอนทิตีทำสิ่งนั้นแล้วปล่อยให้มันเรียกวิธีการบริการโดเมน (หรือวิธีอื่น ๆ ให้บริการโดเมนเรียกวิธีการในนิติบุคคล)
  • เพิ่มเหตุการณ์โดเมนในวิธีเอนทิตีซึ่งเป็นตัวจัดการที่เรียกใช้บริการโดเมน (ประเภทของกิจกรรมโดเมนที่ฉันกำลังพูดถึงคือ: http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

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


1
ขอบคุณสำหรับลิงก์ที่น่าสนใจไปยังข้อมูลเกี่ยวกับกิจกรรมโดเมน
JW01

ต้องเรียกวิธีการทั้งสองนี้ตามลำดับที่ระบุหรือไม่
SpaceTrucker

@SpaceTrucker ในกรณีเฉพาะของฉันมันไม่สำคัญเลย แต่ในแต่ละตัวเลือกที่ฉันพูดถึงตัวเองมันเป็นไปได้ที่จะสั่งการดำเนินการของวิธีการหากต้องการ
dvdvorle

คำตอบ:


19

ให้บริการแอปพลิเคชันโทรทั้งสองวิธี

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

ใช้วิธีการฉีด / ส่งสองครั้งเพื่อฉีดบริการโดเมนลงในเอนทิตีปล่อยให้เอนทิตีทำสิ่งนั้นแล้วปล่อยให้มันเรียกวิธีการบริการโดเมน (หรือวิธีอื่น ๆ ให้บริการโดเมนเรียกวิธีการในนิติบุคคล)

นี่เป็นวิธีที่ดีกว่าเนื่องจากมีการมอบหมายพฤติกรรมให้กับเอนทิตีหรือบริการโดเมนมากกว่า วิธีที่ดีที่สุดในการใช้งานนี้คือการให้เอนทิตีแสดงการพึ่งพาบริการเป็นพารามิเตอร์ของวิธีการแสดงพฤติกรรมในมือ

เพิ่มเหตุการณ์โดเมนในวิธีเอนทิตีซึ่งเป็นตัวจัดการที่เรียกใช้บริการโดเมน

รูปแบบเหตุการณ์โดเมนตามที่อธิบายโดย Udi และ Evans เองนั้นค่อนข้างหลากหลายและสามารถนำไปใช้ในหลากหลายสถานการณ์ มีความยุ่งยากเล็กน้อยที่มาพร้อมกับมันอย่างไรก็ตาม ขั้นแรกคุณต้องตรวจสอบให้แน่ใจว่าคุณมีการกำหนดขอบเขตที่เหมาะสมภายในผู้เผยแพร่กิจกรรมโดเมน ตัวจัดการเหตุการณ์ในโดเมนของคุณส่วนใหญ่จะมีการอ้างอิงและถ้าคุณใช้คอนเทนเนอร์ IoC คุณต้องตรวจสอบให้แน่ใจว่าอินสแตนซ์ที่เหมาะสมถูกแทรก ตัวอย่างเช่นในเว็บแอปพลิเคชัน[ThreadStatic]คุณลักษณะเป็นปัญหาสำหรับการกำหนดขอบเขต ความซับซ้อนอีกอย่างก็คือขอบเขตของการถอดเสียง คุณต้องคำนึงถึงการทำธุรกรรมด้วยเพราะหากนิติบุคคลสร้างเหตุการณ์โดเมน แต่การส่งข้อมูลครั้งต่อ ๆ ไปล้มเหลวตัวจัดการเหตุการณ์ของโดเมนทั้งหมดจะต้องมีวิธีย้อนกลับไม่เช่นนั้นคุณจะต้องเพิ่มเหตุการณ์ที่ไม่ถูกต้อง อย่างไรก็ตามหากคุณมีฐานเหล่านี้ครอบคลุมกิจกรรมโดเมนเป็นรูปแบบที่ดีสำหรับการห่อหุ้มตรรกะโดเมนภายในเอนทิตีเอง

ความแตกต่างระหว่างวิธีที่ 2 และ 3 ขึ้นอยู่กับกรณีการใช้งาน เหตุการณ์โดเมนใช้เมื่อคุณต้องการที่จะก่อให้เกิดพฤติกรรมการเพิ่มเติมในการตอบสนองต่อเหตุการณ์ที่อยู่ในอดีตกาล นี่เป็นข้อ จำกัด ที่สำคัญเนื่องจากตัวจัดการเหตุการณ์โดเมนไม่สามารถส่งผลกระทบต่อพฤติกรรมของเอนทิตี ในทางกลับกันด้วยวิธีที่ 2 บริการที่ฉีดมีศักยภาพที่จะส่งผลกระทบต่อพฤติกรรมเนื่องจากมีการประกาศการพึ่งพาสำหรับพฤติกรรมนั้น ๆ

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