คำถามติดแท็ก domain-driven-design

การออกแบบที่ขับเคลื่อนด้วยโดเมน (DDD) เป็นวิธีการพัฒนาซอฟต์แวร์สำหรับความต้องการที่ซับซ้อนโดยการเชื่อมต่อการใช้งานกับรูปแบบการพัฒนา

2
DDD: ถูกต้องหรือไม่สำหรับการรวมรูทเพื่อระงับการอ้างอิงถึงการรวมรูทอื่น?
เมื่อติดตามการออกแบบที่ขับเคลื่อนด้วยโดเมน (DDD) จะถูกต้องหรือไม่สำหรับการรวมของรูทเพื่อเก็บการอ้างอิงไปยังเอนทิตีภายในที่เกิดขึ้นเป็นเอนทิตีรูทของการรวมแยกต่างหาก ฉันเชื่อว่านี่ไม่ถูกต้องส่วนใหญ่เป็นเพราะกฎนี้ในหนังสือสีฟ้า : ไม่มีสิ่งใดนอกขอบเขต AGGREGATE ที่สามารถเก็บการอ้างอิงถึงสิ่งใด ๆ ภายในยกเว้นราก ENTITY ENTITY รูทสามารถส่งการอ้างอิงไปยัง ENTITIES ภายในกับวัตถุอื่น ๆ ได้ แต่วัตถุเหล่านั้นสามารถใช้งานได้ชั่วคราวเท่านั้นและอาจไม่สามารถใช้อ้างอิงได้ รูทอาจส่งมอบค่าของวัตถุประสงค์ให้แก่วัตถุอื่นและไม่สำคัญว่าจะเกิดอะไรขึ้นกับมันเนื่องจากเป็นเพียงค่าและจะไม่มีการเชื่อมโยงกับ AGGREGATE อีกต่อไป หากการรวมรากถือการอ้างอิงไปยังการรวมรากอื่นขอบเขตของอดีตถูกละเมิดและแนวคิดทั้งหมดของการรวมเสียหายดังนั้นฉันเชื่อว่าถ้าการรวมรากดูเหมือนว่าจำเป็นต้องระงับการอ้างอิงถึงการรวมรากอื่นแล้วฉันต้อง เพื่อสร้างเอนทิตีที่แตกต่างกันซึ่งอาจจะแบ่งสมาชิกบางส่วนเหมือนกับเอนทิตีรูทอื่น แต่จะไม่มีข้อมูลประจำตัวทั่วโลกเช่นกฎอื่น ๆ ในรัฐหนังสือ: รูต ENTITIES มีตัวตนระดับโลก ENTITIES ภายในขอบเขตมีเอกลักษณ์เฉพาะที่ไม่ซ้ำกันภายใน AGGREGATE ฉันเชื่อว่านี่จะเป็นวิธีที่ถูกต้อง แต่เนื่องจากมันให้ความรู้สึกซ้ำซากและซ้ำซ้อน (เมื่อนำออกจากบริบทของ DDD ด้วย OOP บริสุทธิ์) ฉันกำลังขอคำติชม

2
การใช้ DDD: ผู้ใช้และการอนุญาต
ฉันกำลังทำงานกับแอปพลิเคชันขนาดเล็กที่พยายามเข้าใจหลักการของการออกแบบที่ขับเคลื่อนด้วยโดเมน หากประสบความสำเร็จนี่อาจเป็นโครงการนำร่องสำหรับโครงการขนาดใหญ่ ฉันกำลังพยายามติดตามหนังสือ "ใช้การออกแบบโดเมนขับเคลื่อนด้วย" (โดย Vaughn Vernon) และพยายามใช้ฟอรัมสนทนาที่คล้ายกันและเรียบง่าย ฉันได้ลองดูตัวอย่าง IDDD ของ GitHub ฉันมีปัญหาในการใช้ข้อมูลประจำตัวและการเข้าถึงกรณีของฉัน ให้ฉันให้ข้อมูลพื้นหลัง: ฉัน (หวังว่า) เข้าใจเหตุผลที่อยู่เบื้องหลังการแยกผู้ใช้และตรรกะการอนุญาต: มันเป็นโดเมนที่สนับสนุนและเป็นบริบทที่แตกต่างกัน ในโดเมนหลักไม่มีผู้ใช้เพียงแค่ผู้สร้างผู้ดูแล ฯลฯ สิ่งเหล่านี้ถูกสร้างขึ้นโดยการเข้าถึงบริบทผู้ใช้และการเข้าถึงโดยใช้บริการจากนั้นจึงแปลวัตถุผู้ใช้ที่ได้รับและผู้ดูแล การดำเนินการกับโดเมนจะถูกเรียกพร้อมกับบทบาทที่เกี่ยวข้องเป็นพารามิเตอร์: เช่น: ModeratePost( ..., moderator); วิธีการของวัตถุโดเมนตรวจสอบว่าอินสแตนซ์ของโมเดอเรเตอร์ที่กำหนดไม่ใช่โมฆะ (อินสแตนซ์ของโมเดอเรเตอร์จะเป็นโมฆะถ้าผู้ใช้ที่ถามจากบริบทผู้ใช้และบริบทไม่มีบทบาทผู้ดูแล) ในกรณีหนึ่งจะทำการตรวจสอบเพิ่มเติมก่อนที่จะแก้ไขโพสต์: if (forum.IsModeratedby(moderator)) คำถามของฉันคือ: ในกรณีหลังความกังวลด้านความปลอดภัยไม่ได้รวมกันอีกครั้งในโดเมนหลัก? ก่อนหน้านี้หนังสือระบุว่า "ใครสามารถโพสต์หัวข้อหรือภายใต้เงื่อนไขที่อนุญาตฟอรั่มเพียงแค่ต้องรู้ว่าผู้แต่งกำลังทำเช่นนั้นในตอนนี้" การนำไปใช้ตามบทบาทในหนังสือเล่มนี้ค่อนข้างตรงไปตรงมา: เมื่อ Moderator เป็นโดเมนหลักพยายามแปลง userId ปัจจุบันเป็น Moderator หรือเป็นผู้เขียนเมื่อต้องการ บริการจะตอบกลับด้วยอินสแตนซ์ที่เหมาะสมหรือเป็นโมฆะหากผู้ใช้ไม่มีบทบาทที่จำเป็น อย่างไรก็ตามฉันไม่สามารถเห็นได้ว่าฉันจะปรับให้เข้ากับรูปแบบการรักษาความปลอดภัยที่ซับซ้อนมากขึ้นได้อย่างไร โครงการปัจจุบันของเราที่ฉันกำลังดำเนินการอยู่นั้นมีรูปแบบที่ค่อนข้างซับซ้อนกับกลุ่ม ACL ฯลฯ แม้จะมีกฎที่ไม่ซับซ้อนมากเช่น: "โพสต์ควรแก้ไขโดยเจ้าของหรือบรรณาธิการเท่านั้น" …

6
Microservices อัตโนมัติคิวเหตุการณ์และการค้นหาบริการ
ฉันได้อ่านเกี่ยวกับบริการไมโครเมื่อไม่นานมานี้และนี่คือข้อสรุปบางอย่างที่ฉันได้รับ (โปรดแก้ไขฉันหากฉันผิดที่จุดใด) สถาปัตยกรรมบริการไมโครเป็นไปด้วยดีกับการออกแบบที่ขับเคลื่อนด้วยโดเมน โดยทั่วไปแล้วหนึ่ง MS หมายถึงบริบทที่มีขอบเขตหนึ่ง ถ้า micro-service Aต้องการฟังก์ชันที่อยู่ใน micro-service BโมเดลของฉันอาจผิดและAและB ควรเป็น micro-service / BC หนึ่งอัน การสื่อสารแบบซิงโครนัสระหว่างบริการไมโคร (คำขอ HTTP โดยตรง) ไม่ดีทำให้ขัดต่อวัตถุประสงค์ของบริการไมโครและแนะนำการมีเพศสัมพันธ์ระหว่างส่วนประกอบ การสื่อสารแบบอะซิงโครนัสระหว่างบริการเป็นที่ต้องการ บริการควรเผยแพร่กิจกรรมไปยังคิวข้อความเพื่อให้บริการอื่น ๆ สามารถสมัครและประมวลผลส่วนหนึ่งของเหตุการณ์หรือใช้เพื่อทำซ้ำส่วนของข้อมูลที่จำเป็นสำหรับบริบทของพวกเขา วิธีนี้บริการสามารถดำเนินการตามคำขอแม้บริการอื่น ๆ จะหยุดทำงานซึ่งไม่ได้เกิดขึ้นในการสื่อสารแบบซิงโครนัส ถ้า micro-service Aเผยแพร่เหตุการณ์, micro-service Bสมัครสมาชิกกับเหตุการณ์นั้นและสร้างเหตุการณ์ใหม่เป็นผลลัพธ์, micro-service Aไม่ควรเป็นการประมวลผลเหตุการณ์ที่สร้างขึ้นใหม่, ซึ่งจะเป็นการอ้างอิงแบบวงกลม ในกรณีนี้เราควรแนะนำบริการไมโครที่สามหรือรวมAและBเข้ากับบริการไมโครAB บริการไมโครเป็นจริงคำที่ทำให้เข้าใจผิด เราควรพยายามเพื่อบริบทขนาดเล็ก แต่ไม่จำเป็นต้องเป็นกรณี คำไม่ควรเป็น "บริการไมโคร" แต่ " ใหญ่พอที่จะทำงานบริการ " บริการไมโครช่วยให้เราสามารถแนะนำฟังก์ชั่นใหม่ได้อย่างง่ายดายและไม่ต้องกลัวว่าเราจะทำลายทั้งระบบ มันสามารถทำได้โดยการแนะนำบริการใหม่หรือ refactoring หนึ่งในที่มีอยู่ …

2
นี่เป็นโครงสร้างโซลูชัน Visual Studio ที่ดีสำหรับการออกแบบโดเมนขับเคลื่อนบริการเว็บสงบหรือไม่?
ฉันกำลังสร้าง. NET 4.5 C # Web API RESTful solution และฉันต้องการให้ใครบางคนบอกฉันว่าโซลูชันโครงการของฉันนั้นถูกต้องและ / หรือฉลาด (- เพียงพอหรือยัง) สำหรับโซลูชั่นที่ออกแบบโดยใช้ Domain Driven Design โปรด โซลูชันได้แบ่งออกเป็น 6 โครงการ: /ฐาน (ไม่ได้อ้างอิงอะไรเลย) โครงการเว็บและสร้างส่วนต่อประสานระหว่างโซลูชันกับโลกภายนอก มีตัวควบคุม Web API ไม่มีเหตุผลใดเลยในการรวบรวมค่าจากวัตถุที่ร้องขอและขอให้ BizApi ทำงานได้ /Biz.Api (อ้างอิงโดยฐาน]) ให้บริการโดเมนและอนุญาตให้ / โครงการอินเทอร์เฟซฐานสามารถเข้าถึงวัตถุตรรกะทางธุรกิจของโดเมนในโครงการ /Biz.Domain /Biz.Domain (อ้างอิงโดย Biz.Api) จัดเตรียมคลาสโดเมนสำหรับเลเยอร์ Biz.Api เหล่านี้มีวิธีการจัดการข้อมูลของธุรกิจในหน่วยความจำ /Dal.Db (อ้างอิงโดย Biz.Api) เลเยอร์ที่เก็บฐานข้อมูล เข้าถึงฐานข้อมูลและแมปข้อมูลที่ส่งคืนไปยัง DTO ภายในที่กำหนดในเลเยอร์ …

3
เมื่อใดควรรูทรวมโดยรวมมี AR อื่น (และเมื่อใดควรจะรวม)
ให้ฉันเริ่มต้นด้วยการขอโทษเป็นครั้งแรกสำหรับความยาวของโพสต์ แต่ฉันต้องการที่จะถ่ายทอดรายละเอียดมากขึ้นล่วงหน้าดังนั้นฉันไม่ได้ใช้เวลาของคุณในการแสดงความคิดเห็น ฉันกำลังออกแบบแอพพลิเคชั่นตามแนวทาง DDD และสงสัยว่าฉันสามารถทำตามแนวทางใดได้บ้างเพื่อพิจารณาว่ารูทการรวมควรมี AR อื่นหรือไม่ถ้าพวกมันควรจะแยกจากกัน นำกรณีของแอพพลิเคชั่นนาฬิกาเวลาแบบเรียบง่ายที่ช่วยให้พนักงานสามารถบันทึกนาฬิกาเข้าหรือออกได้ทั้งวัน UI อนุญาตให้พวกเขาป้อน ID พนักงานและ PIN ซึ่งได้รับการตรวจสอบแล้วและสถานะปัจจุบันของพนักงานที่ดึงมา หากพนักงานมีการโอเวอร์คล็อกในขณะนี้ UI จะแสดงปุ่ม "Clock Out" และในทางกลับกันหากไม่มีการโอเวอร์คล็อกปุ่มจะอ่าน "Clock In" การกระทำที่ทำโดยปุ่มจะสอดคล้องกับสถานะของพนักงานเช่นกัน แอปพลิเคชันเป็นเว็บไคลเอ็นต์ที่เรียกใช้เซิร์ฟเวอร์แบ็คเอนด์ที่เปิดเผยผ่านส่วนต่อประสานบริการ RESTful การผ่านครั้งแรกของฉันในการสร้าง URL ที่ใช้งานง่ายและอ่านได้ทำให้เกิดจุดปลายสองจุดต่อไปนี้: http://myhost/employees/{id}/clockin http://myhost/employees/{id}/clockout หมายเหตุ: สิ่งเหล่านี้จะใช้หลังจากรหัสพนักงานและ PIN ได้รับการตรวจสอบแล้วและมีการส่ง "โทเค็น" ที่แสดงถึง "ผู้ใช้" ในส่วนหัว นี่เป็นเพราะมี "โหมดผู้จัดการ" ที่ช่วยให้ผู้จัดการหรือหัวหน้างานสามารถเข้า - ออกหรือพนักงานคนอื่น แต่เพื่อประโยชน์ของการสนทนานี้ฉันพยายามทำให้มันง่าย บนเซิร์ฟเวอร์ฉันมี ApplicationService ที่ให้บริการ API แนวคิดแรกของฉันสำหรับวิธี ClockIn …

5
จะรวม TDD และ DDD ที่เข้มงวดได้อย่างไร
TDD เป็นเรื่องเกี่ยวกับการออกแบบโค้ดซึ่งได้รับคำแนะนำจากการทดสอบ ดังนั้นเลเยอร์ทั่วไปมักจะไม่สร้างล่วงหน้า พวกเขาควรปรากฏขึ้นเล็กน้อยผ่านขั้นตอนการรีแฟคเตอร์ การออกแบบที่ขับเคลื่อนด้วยโดเมนนั้นเกี่ยวข้องกับรูปแบบทางเทคนิคมากมายการกำหนดเลเยอร์ที่ได้รับการยอมรับเช่นแอพพลิเคชั่นเลเยอร์โครงสร้างพื้นฐานเลเยอร์โดเมนเลเยอร์คงอยู่ ในการเริ่มต้นการเข้ารหัสส่วนของโครงการ DDD ตั้งแต่เริ่มต้นจะทำอย่างไร? ฉันควรปล่อยให้การออกแบบโผล่ออกมาจากการทดสอบอย่างเคร่งครัดหรือไม่หมายถึงไม่มีการแยกข้อกังวล (ไม่มีเลเยอร์) และ refactor เพื่อให้พอดีกับรูปแบบทางเทคนิคของ DDD? หรือฉันควรสร้างเลเยอร์ที่ว่างเปล่าเหล่านั้น (แอปพลิเคชันหน่วยงาน / บริการโดเมนโครงสร้างพื้นฐาน) และให้ TDD เหมาะสมกับแต่ละชั้นอย่างอิสระ (ใช้ mocks เพื่อแยกระหว่างเลเยอร์)

2
DDD CQRS - ต่อการสืบค้นและการอนุญาตตามคำสั่ง
สรุป ควรอนุญาตใน CQRS / DDD ต่อคำสั่ง / แบบสอบถามหรือไม่? ฉันกำลังพัฒนาเป็นครั้งแรกที่แอปพลิเคชันออนไลน์ที่ใช้รูปแบบ DDD CQRS มากหรือน้อยอย่างเคร่งครัด ฉันเจอปัญหาบางอย่างซึ่งฉันไม่สามารถไปไหนมาไหนได้ แอปพลิเคชันที่ฉันสร้างเป็นแอปพลิเคชันบัญชีแยกประเภทที่อนุญาตให้ผู้ใช้สร้างบัญชีแยกประเภทเช่นเดียวกับการอนุญาตให้บุคคลอื่นดู / แก้ไข / ลบพวกเขาเช่นพนักงาน ผู้สร้างบัญชีแยกประเภทควรสามารถแก้ไขสิทธิ์การเข้าถึงของบัญชีแยกประเภทที่เขาสร้างขึ้น สามารถเปลี่ยนความเป็นเจ้าของได้ โดเมนมีสองมวลTLedgerและTUser ฉันอ่านบทความจำนวนมากที่มีคำหลัก DDD / CQRS เกี่ยวกับความปลอดภัยการอนุญาต ฯลฯ ส่วนใหญ่ระบุว่าการอนุญาตเป็นGeneric Subdomainเว้นแต่มีใครกำลังสร้างแอปพลิเคชันความปลอดภัย ในกรณีนี้โดเมนหลักคือโดเมนการบัญชีที่มีความสนใจในการทำธุรกรรมการสร้างสมดุลและการบัญชี แต่ฟังก์ชั่นของความสามารถในการจัดการการเข้าถึงเม็ดเล็กที่ละเอียดไปยังบัญชีแยกประเภทก็จำเป็น ฉันสงสัยว่าจะออกแบบมันอย่างไรในเงื่อนไข DDD / CQRS มันระบุไว้ในบทเรียน DDD รอบ ๆ สถานที่ที่คำสั่งเป็นส่วนหนึ่งของภาษาที่แพร่หลาย พวกเขามีความหมาย พวกมันเป็นการกระทำที่เป็นรูปธรรมซึ่งเป็นตัวแทนของ เพราะคำสั่งและแบบสอบถามเหล่านั้นทั้งหมดเป็นการกระทำที่เกิดขึ้นจริงที่ผู้ใช้จะดำเนินการใน "ชีวิตจริง" การดำเนินการอนุญาตควรจะควบคู่ไปกับ "คำสั่ง" และ "แบบสอบถาม" เหล่านี้ทั้งหมด ผู้ใช้จะมีสิทธิ์ในการดำเนินการ …

5
DDD, Saga & การจัดหากิจกรรม: การกระทำแบบชดเชยสามารถลบในร้านค้าได้หรือไม่?
ฉันรู้ว่าคำถามข้างต้นอาจทำให้เกิดอะไรขึ้นบ้าง แต่ขอให้ฉันพยายามอธิบาย: ฉันกำลังพยายามสรุปแนวคิดที่เกี่ยวข้องสองอย่างโดยทั่วไปแล้วรูปแบบ Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) ร่วมกับ Event-sourcing (แนวคิด DDD) : http://en.wikipedia.org/wiki/Domain-driven_design ) โพสต์ที่ดีที่รวมเข้าด้วยกัน: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/ ฉันได้รับคำถามในหนึ่งนาที แต่ฉันคิดว่าฉันต้องพยายามสรุปสิ่งที่ฉันเข้าใจก่อน (ซึ่งอาจผิดพลาดได้โปรดแก้ไขให้ถูกต้องหากเป็นกรณีนี้) เนื่องจากสิ่งนี้อาจส่งผลกระทบต่อสาเหตุที่ฉัน ถามคำถามเพื่อเริ่มต้นด้วย: รูปแบบ Saga คือนายหน้าประเภทหนึ่งที่ให้การกระทำ (ผู้ใช้ปลายทางอัตโนมัติ ฯลฯ โดยพื้นฐานแล้วอะไรก็ตามที่กำลังจะเปลี่ยนข้อมูล) จะแบ่งการกระทำนั้นในกิจกรรมทางธุรกิจและส่งกิจกรรมเหล่านี้เป็นข้อความไปยัง Message Bus ซึ่ง ในทางกลับกันส่งไปยังรากรวมที่เกี่ยวข้องที่จะได้รับการดูแล รากรวมเหล่านี้สามารถทำงานได้อย่างสมบูรณ์แบบอัตโนมัติ (แยกความกังวล, ปรับขยายได้ดี ฯลฯ ) Saga-instance นั้นไม่มีตรรกะทางธุรกิจใด ๆ ที่มีอยู่ในรากรวมที่มันส่งกิจกรรมไปให้ 'ตรรกะ' เพียงอย่างเดียวที่มีอยู่ใน Saga คือ 'กระบวนการ' - ตรรกะ (มักใช้เป็น Statemachine) …

7
ดั้งเดิมเทียบกับคลาสเพื่อแสดงวัตถุโดเมนอย่างง่าย
อะไรคือแนวทางทั่วไปหรือกฎง่ายๆสำหรับเมื่อใช้วัตถุโดเมน speciifc เทียบกับสตริงหรือหมายเลขธรรมดา? ตัวอย่าง: อายุกับจำนวนเต็ม? ชั้น FirstName vs String? UniqueID vs String หมายเลขโทรศัพท์กับสตริงเทียบกับ Long หรือไม่ DomainName คลาส vs String? ฉันคิดว่าผู้ปฏิบัติงาน OOP ส่วนใหญ่จะพูดคลาสที่เฉพาะเจาะจงสำหรับ PhoneNumber และ DomainName กฎเพิ่มเติมเกี่ยวกับสิ่งที่ทำให้พวกเขาถูกต้องและวิธีการเปรียบเทียบทำให้ชั้นเรียนง่าย ๆ ง่ายขึ้นและปลอดภัยยิ่งขึ้นที่จะจัดการกับ แต่สำหรับสามคนแรกนั้นมีการถกเถียงกันมากขึ้น ฉันไม่เคยเจอคลาส "อายุ" แต่เราสามารถโต้แย้งได้ว่ามันสมเหตุสมผลเพราะมันต้องไม่ใช่ลบ (โอเคฉันรู้ว่าคุณสามารถโต้เถียงสำหรับวัยลบได้ แต่มันเป็นตัวอย่างที่ดีที่เกือบเทียบเท่ากับจำนวนเต็มดั้งเดิม) สตริงเป็นเรื่องปกติที่จะแสดง "ชื่อ" แต่มันไม่สมบูรณ์เพราะสตริงที่ว่างเปล่าเป็นสตริงที่ถูกต้อง แต่ไม่ใช่ชื่อที่ถูกต้อง การเปรียบเทียบมักจะทำโดยไม่สนใจขนาดตัวพิมพ์ แน่นอนว่ามีวิธีการตรวจสอบความว่างเปล่าทำการเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่จำเป็นต้องให้ผู้บริโภคทำเช่นนี้ คำตอบนั้นขึ้นอยู่กับสภาพแวดล้อมหรือไม่? ฉันเกี่ยวข้องกับซอฟต์แวร์องค์กร / ซอฟต์แวร์มูลค่าสูงที่จะมีชีวิตอยู่และได้รับการดูแลรักษาเป็นเวลานานกว่าทศวรรษ บางทีฉันอาจจะคิดมากเรื่องนี้ แต่ฉันอยากจะรู้ว่าถ้าใครมีกฎเกณฑ์ว่าเมื่อใดควรเลือกคลาสเทียบกับแบบดั้งเดิม

2
วิธีการนำตัวจัดการกระบวนการไปใช้ในการจัดหากิจกรรม
ฉันกำลังทำงานกับแอปพลิเคชันตัวอย่างขนาดเล็กเพื่อเรียนรู้แนวคิดของ CQRS และการจัดหากิจกรรม ฉันมีการBasketรวมและการProductรวมซึ่งควรทำงานอย่างอิสระ นี่คือโค้ดหลอกบางอย่างที่จะแสดงการใช้งาน Basket { BasketId; OrderLines; Address; } // basket events BasketCreated { BasketId; } ItemAdded { BasketId; ProductId; Quantity } AddItemSucceeded { BasketId; ProductId; Quantity } AddItemRevoked { BasketId; ProductId; Quantity } ItemRemoved { BasketId; ProductId; Quantity } CheckedOut { BasketId; Address } Product { ProductId; …

1
วิธีการจัดทำเอกสารภาษาที่แพร่หลาย
บริษัท ของเรากำลังอยู่ในขั้นตอนการแปลงกระบวนการทางธุรกิจจำนวนมาก (และความรู้เชิงสถาบันที่เกี่ยวข้อง) เป็นซอฟต์แวร์องค์กรใหม่ โครงการกำลังดำเนินไปได้ดี แต่เมื่อเราดำเนินการต่อไปก็ชัดเจนว่ามีความสับสนมากมายเกี่ยวกับคำศัพท์และคำจำกัดความทั้งในด้านธุรกิจและการพัฒนา ฉันได้รับทราบถึงข้อโต้แย้งของอีวานในการสร้างภาษาที่แพร่หลายอยู่พักหนึ่ง แต่นี่เป็นครั้งแรกที่ฉันต้องการบันทึกเอกสารอย่างเป็นทางการ เมื่อฉันมองไปรอบ ๆ และลองนึกถึงสถานที่ / วิธีการจัดทำเอกสารคำศัพท์ UL ของเราฉันก็หลงทาง บริษัท อื่นทำเอกสารภาษาที่ใช้กันแพร่หลายอย่างไร นี่เป็นเพียงพจนานุกรมวิกิหรือไม่ มีเครื่องมือบางอย่างสำหรับจุดประสงค์นี้หรือไม่?

4
การเข้าถึงที่เก็บจากโดเมน
สมมติว่าเรามีระบบบันทึกงานเมื่อมีการบันทึกงานผู้ใช้จะระบุหมวดหมู่และค่าเริ่มต้นของงานเป็นสถานะ 'ดีเด่น' สมมติในกรณีนี้ว่าหมวดหมู่และสถานะจะต้องมีการใช้งานเป็นเอนทิตี ปกติฉันจะทำสิ่งนี้: แอพลิเคชันเลเยอร์: public class TaskService { //... public void Add(Guid categoryId, string description) { var category = _categoryRepository.GetById(categoryId); var status = _statusRepository.GetById(Constants.Status.OutstandingId); var task = Task.Create(category, status, description); _taskRepository.Save(task); } } Entity: public class Task { //... public static void Create(Category category, Status status, string description) { …

3
การตรวจสอบและการอนุญาตในสถาปัตยกรรมแบบเลเยอร์
ฉันรู้ว่าคุณกำลังคิด (หรืออาจจะตะโกน), "ไม่ใช่คำถามที่ถามอีกว่าการตรวจสอบเป็นของสถาปัตยกรรมชั้นหรือไม่?" ใช่แล้ว แต่หวังว่านี่จะเป็นเรื่องที่ต่างออกไปเล็กน้อย ฉันเชื่อมั่นว่าการตรวจสอบมีหลายรูปแบบตามบริบทและแตกต่างกันไปในแต่ละระดับของสถาปัตยกรรม นั่นเป็นพื้นฐานสำหรับการโพสต์ช่วยระบุประเภทของการตรวจสอบที่ควรดำเนินการในแต่ละชั้น นอกจากนี้คำถามที่มักเกิดขึ้นก็คือการตรวจสอบสิทธิ์ สถานการณ์ตัวอย่างมาจากแอปพลิเคชันสำหรับธุรกิจจัดเลี้ยง ในระหว่างวันผู้ขับขี่อาจเปลี่ยนเป็นเงินสดส่วนเกินที่พวกเขาสะสมไว้ในสำนักงานขณะนำรถบรรทุกจากที่หนึ่งไปยังอีกที่หนึ่ง แอปพลิเคชั่นอนุญาตให้ผู้ใช้บันทึก 'เงินสดลดลง' โดยการรวบรวม ID ของไดรเวอร์และจำนวนเงิน นี่คือรหัสโครงกระดูกบางส่วนเพื่อแสดงเลเยอร์ที่เกี่ยวข้อง: public class CashDropApi // This is in the Service Facade Layer { [WebInvoke(Method = "POST")] public void AddCashDrop(NewCashDropContract contract) { // 1 Service.AddCashDrop(contract.Amount, contract.DriverId); } } public class CashDropService // This is the Application …

3
Domain Objects ใน Domain Driven Design ควรเป็นแบบเขียนอย่างเดียวหรือไม่
ฉันได้อ่านเกี่ยวกับการออกแบบการขับเคลื่อนด้วยโดเมนเป็นเวลาเกือบสองปีและได้รับการแนะนำแนวคิดบางอย่างเกี่ยวกับการทำงานประจำวันของฉันอย่างน้อยหรือวางแผนอย่างน้อยสำหรับสิ่งที่ฉันทำเป็นประจำในการออกแบบโดเมนที่ขับเคลื่อนได้ ข้อสรุปหนึ่งที่ฉันได้เริ่มมาโดยเฉพาะอย่างยิ่งในการตอบสนองต่อการอ่านเพิ่มเติมเกี่ยวกับการจัดหากิจกรรมและการแยกความรับผิดชอบคำสั่งแบบสอบถาม (CQRS) ที่บางทีวัตถุโดเมนมีวัตถุประสงค์ที่จะใช้สำหรับการเขียนเท่านั้น เพื่อให้ชัดเจนยิ่งขึ้นดูเหมือนว่าสิ่งที่ผู้คนแนะนำอย่างละเอียดในเอกสารส่วนใหญ่ที่ฉันได้อ่านว่าวัตถุโดเมนมีหน้าที่ในการดำเนินการ / การคำนวณโดเมนเป็นศูนย์กลางการตรวจสอบความถูกต้องและจากนั้นส่วนใหญ่จะเป็นถนน โครงสร้างพื้นฐานที่มีให้ภายในการใช้พื้นที่เก็บข้อมูล แม้ว่าฉันจะชอบความจริงที่ว่าสิ่งนี้อาจลดความซับซ้อนของโมเดลโดเมนลงอย่างมากเนื่องจากช่วยลดความรับผิดชอบในการเปิดเผยสถานะ ถ้ามันถูกต้องจริง ๆ แล้วว่าวัตถุโดเมนส่วนใหญ่จะใช้เป็นวัตถุแบบเขียนอย่างเดียวแล้วนั่นทำให้เกิดคำถามสำหรับฉันที่ฉันหวังว่าใครบางคนสามารถตอบ วิธีการหนึ่งทำการทดสอบหน่วยบนวัตถุที่มี setters หรือวิธีการที่ปรับเปลี่ยนสถานะของวัตถุ แต่ที่ให้ไม่มีส่วนต่อประสานภายนอกสาธารณะเพื่ออ่านสถานะจากเช่น getters คุณสมบัติใน C #? มันโอเคที่จะเปิดเผยสถานะเพียงเพื่อจุดประสงค์ในการทำให้วัตถุนั้นทดสอบได้หรือไม่? ผู้ใช้จะแสดงผลลัพธ์ของการคำนวณหรือการดำเนินการในโดเมนโดยไม่ต้องยืนยันพวกเขาได้อย่างไรแล้วดึงผลลัพธ์จากการเก็บข้อมูลไว้ภายนอกบริบทของโดเมน การเปิดเผยสถานะเพียงเพื่อจุดประสงค์ในการแสดงผลลัพธ์เท่านั้นหรือไม่ เป็นกฎของหัวแม่มือที่ควรได้รับทรัพย์สินเท่านั้น (รับ accessors) เป็นคนที่สามารถเขียนได้ในโดเมน? หรือกล่าวว่าคุณสมบัติที่แตกต่างกันอย่างอ่านง่ายควรเป็นสิ่งเดียวที่ควรหลีกเลี่ยงเนื่องจากมีไว้เพื่อการอ่านเท่านั้นและไม่ได้มีบทบาทที่จำเป็นในแบบจำลองโดเมนจริงหรือ วัสดุที่เกี่ยวข้อง: TDD, DDD และ Encapsulation

3
DDD: จะวางตัวจัดการเหตุการณ์ของโดเมนได้ที่ไหน
คุณช่วยบอกความเห็นของคุณว่าเลเยอร์ตัวไหนที่ถูกต้องในการวางตัวจัดการเหตุการณ์ของโดเมนใน DDD ตัวอย่างเช่นฉันมีบริการแอปพลิเคชันเพื่อเพิ่มสัญญาใหม่และฉันต้องการส่งการแจ้งเตือนทางอีเมลไปยังบุคคลที่ติดต่อเมื่อมีการเพิ่มสัญญาดังนั้นผู้ส่งอีเมล (ที่จัดการกับ ContractAdded) แอปพลิเคชันบริการหรือบริการโดเมนหรือ อื่น ๆ อีก?

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