นี่เป็นโครงสร้างโซลูชัน Visual Studio ที่ดีสำหรับการออกแบบโดเมนขับเคลื่อนบริการเว็บสงบหรือไม่?


15

ฉันกำลังสร้าง. 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 ภายในที่กำหนดในเลเยอร์ / อินเตอร์เฟส

  • /Dal.Services

(อ้างอิงโดย Biz.Api)

จัดเตรียมพร็อกซีเลเยอร์กับการอ้างอิงภายนอกเช่นบริการเว็บและจับคู่ข้อมูลที่ส่งคืนไปยัง DTO ภายในที่กำหนดในโครงการ / อินเตอร์เฟส

  • / การเชื่อมต่อ

(อ้างอิงจากโครงการส่วนใหญ่ด้านบน)

มีคลาส DTO สำหรับส่งข้อมูลรอบ ๆ โซลูชันและอินเตอร์เฟส C # เพื่อกำหนดสัญญาสำหรับสิ่งต่าง ๆ เช่น IoC


"/Biz.Api ให้บริการโดเมน": คุณหมายถึง Application Services หรือไม่ นอกจากนี้ที่เก็บมักจะไม่ส่งคืน DTO แต่เป็นเอนทิตี (รวมราก) และการพึ่งพาระหว่างโครงการเหล่านี้ก็ควรจะรู้ด้วยเช่นกัน)
guillaume31

ใช่ฉันหมายถึงบริการต่าง ๆ ที่เก็บกำลังส่งคืนอินสแตนซ์ของคลาสที่ไม่ทำอะไรนอกจากเก็บข้อมูล - ข้อมูลนี้ถูกแมปเข้ากับอินสแตนซ์ที่ใช้ในกรณีนี้คือ AutoMapper อินสแตนซ์ที่ส่งคืนไม่มีวิธีการจัดการที่ฉันรวบรวมเอนทิตีได้
Matt W

"ข้อมูลนี้ถูกแมป": ระหว่างอะไรกับอะไร คุณหมายถึงอะไรโดย "วิธีการจัดการ"
guillaume31 31

คำตอบ:


22

โครงสร้างโฟลเดอร์นี้ได้แรงบันดาลใจจากผู้มีชื่อเสียง หนังสือออกแบบโดเมน Implementing ที่โดย Vaugh Vernon

การแก้ไข:
├เว็บเซอร์(บริการส่วนที่เหลืออาศัยอยู่ที่นี่)
├ WebServiceTests
├แอพลิเคชัน(บริการแอพลิเคชันที่อาศัยอยู่ที่นี่)
├ ApplicationTests
├โดเมน(หน่วยงาน VO บริการโดเมนโรงงานโดเมนรายละเอียดเหตุการณ์โดเมนอินเตอร์เฟซที่เก็บโครงสร้างพื้นฐานการเชื่อมต่อบริการ)
├ DomainTests
├ โครงสร้างพื้นฐาน(คลังเก็บบริการโครงสร้างพื้นฐานหมายถึง, อะแดปเตอร์ไปยังบริการภายนอก)
└การทดสอบโครงสร้างพื้นฐาน

ฉันเริ่มต้นด้วยโซลูชันจากนั้นสร้างสี่โครงการสำหรับแต่ละชั้นในใบสมัครของฉันแล้วอีกสี่โครงการสำหรับการทดสอบแต่ละชั้น

อย่าสร้างโฟลเดอร์interfacesหรือservicesในเลเยอร์โดเมนของคุณแทนคลาสที่เกี่ยวข้องควรจัดกลุ่มตามฟังก์ชันการทำงานในโมดูล


1

เท่าที่เป็นโครงสร้างที่ดูเหมือนว่าตกลงกับผมแม้ว่าผมจะได้มากับที่แตกต่างกันชื่ออธิบายตนเองมากขึ้นเช่น"YourProjectWebApi"แทนที่จะ"Base","Dal.External"แทน"Dal.Services"และอื่น ๆ

อาจมีกลิ่นในส่วน "DTO ภายใน" เนื่องจากคุณควรจะดึงเอนทิตีออกจากที่เก็บและสามารถดำเนินการกับโดเมน (ธุรกิจ) โดยตรงกับพวกเขา หน่วยงานไม่ได้เป็นเพียงแค่ของ DTO

ฉันรวบรวมจากข้อเท็จจริงที่Dal.Dbไม่มีการอ้างอิงถึงBiz.Domain,ว่าเลเยอร์โดเมนกำลังทำแผนที่ระหว่าง DTO จากโครงการอินเทอร์เฟซ (ส่งกลับโดยที่เก็บ?) และวัตถุโดเมนของตัวเอง สิ่งนี้จะไม่ถูกต้องในสถาปัตยกรรม DDD สุดล้ำ (== "หัวหอม" หรือ "หกเหลี่ยม") - ชั้นโดเมนไม่ควรอ้างอิงโครงการอื่น ๆ ด้วยเหตุผลเดียวกันส่วนติดต่อ Repository ควรถูกประกาศใน Domain และไม่Interfacesเหมือนที่ฉันคิดว่ามันเป็น

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