การออกแบบที่ขับเคลื่อนด้วยโดเมนพร้อม Entity Framework และรูปแบบพื้นที่เก็บข้อมูล [ปิด]

ฉันเคยจัดการกับแอปง่ายๆ ที่มี Service Layer ที่มีตรรกะทางธุรกิจทั้งหมด ใน การออกแบบที่ขับเคลื่อนด้วยโดเมน เป็นเรื่องปกติที่จะรักษาตรรกะทางธุรกิจไว้ในโมเดลที่สมบูรณ์

ดูบทแนะนำโดย Pluralsight ที่พวกเขาพูดถึง พื้นที่เก็บข้อมูล และสังเกตเห็นว่าโดยปกติแล้ว repo จะมีการดำเนินการ CRUD ขั้นพื้นฐาน (สร้าง อัปเดต ดึงข้อมูล และลบเอนทิตี) ไม่มีการอธิบายอะไรมากเกี่ยวกับ Entity Framework

Entity Framework 6 & Entity Framework Core ได้จัดเตรียม Repository/UoW ไว้เรียบร้อยแล้ว ฉันสงสัยว่าเราสามารถละเว้นการสร้าง Repository Layer ในกรณีนี้ได้หรือไม่

ฉันจะจินตนาการถึงแอปที่ไม่มีเลเยอร์ Repository แยกต่างหากได้อย่างไร...

ความเข้าใจของฉันคือ:

ตัวอย่างเช่น เรามีโมเดล Customer เป็นรากรวม (โมเดลโดเมนแบบสมบูรณ์) และแบบจำลองนั้นมีความสัมพันธ์แบบหนึ่งต่อกลุ่ม ICollection<Payment> Payments นอกจากนี้ ตาม DDD เราเก็บตรรกะของเราไว้ในโมเดล ดังนั้นเราจึงมีเมธอด MakePayment

รหัสจะเป็นดังนี้:

public class Customer
{
    public virtual ICollection<Payment> Payments { get; set; }

    // ... other properties/collections

    public void MakePayment(decimal amount)
    {
        this.Payments.Add(new Payment() { Amount = amount });
    }
}

ด้วย Entity Framework เราสามารถโหลดทั้งแผนผังอย่างกระตือรือร้น โดยผลลัพธ์ Customer มีการแมป Payments ทั้งหมดแล้ว

(เช่น เราจัดการกับแอป ASP.NET WebAPI)

ดังนั้น ในการชำระเงิน ฉันคิดว่าเราทำสิ่งต่อไปนี้:

  1. ในตัวควบคุม/บริการของเรา เราได้ดึงข้อมูลลูกค้า (เช่น โดย id)

  2. แล้วตามด้วยโค้ด customer.MakePayment(10);

  3. หลังจากนั้นเราเรียกเมธอด dbContext.SaveChanges()

  4. DbContext ติดตามการเปลี่ยนแปลงและจัดเก็บการชำระเงิน - Bingo!

ความเข้าใจของฉันถูกต้องหรือไม่


เกี่ยวกับชั้นบริการ:

จะเป็นไปได้ไหมที่จะมี Service Layer ที่มี DDD ในเว็บแอปดังกล่าว

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

ดูเหมือนเป็นแนวทางที่เหมาะสมที่สุดใช่ไหม


person Alex Herman    schedule 27.12.2018    source แหล่งที่มา
comment
คำถามนี้กว้างเกินไป/อิงตามความคิดเห็น แต่ในความคิดของฉัน คุณกำลังมาถูกทางแล้ว repo เพิ่มเติม, ไม่, เลเยอร์บริการใช่, DDD พร้อมอ็อบเจ็กต์คลาส EF: อาจจะ   -  person Gert Arnold    schedule 28.12.2018
comment
ฉันขอขอบคุณการตอบกลับอย่างรวดเร็วของคุณ @GertArnold แต่ฉันไม่คิดว่ามันจะกว้างเกินไป ... Entity Framework และเฟรมเวิร์กอื่น ๆ พัฒนาขึ้นและ IMHO มีความสับสนมากขึ้นเรื่อย ๆ สำหรับผู้พัฒนาที่เริ่มเรียนรู้ DDD โดยใช้บทช่วยสอนที่ล้าสมัยเล็กน้อย ขอบคุณอีกครั้ง!   -  person Alex Herman    schedule 28.12.2018
comment
บทช่วยสอนบางรายการมีราคาไม่ถูกด้วยซ้ำ และยังคงไม่ครอบคลุมประเด็นสำคัญโดยคำนึงถึงกลุ่มซอฟต์แวร์สมัยใหม่ :)   -  person Alex Herman    schedule 28.12.2018
comment
ก่อนที่ผู้มีอิทธิพลอย่าง Ayende Rahien จะเริ่ม วิพากษ์วิจารณ์รูปแบบนี้อย่างเปิดเผย ว่าชุมชนนักพัฒนาซอฟต์แวร์เริ่มค่อย ๆ นำแนวคิดที่บางทีเราอาจสามารถทำได้โดยไม่ต้อง และอย่างที่คุณพูดไว้ สำหรับ ORM เช่น EF มันเป็นชั้น repo เพิ่มเติม ทำให้ยิ่งน่าสงสัยมากขึ้นไปอีก   -  person Gert Arnold    schedule 28.12.2018


คำตอบ (2)


ฉันสงสัยว่าเราสามารถละเว้นการสร้าง Repository Layer ในกรณีนี้ได้หรือไม่?

ตามที่อธิบายไว้ในย่อหน้าแรกที่นี่ ให้ลองใช้ Generic Repository (DbSet) โดยตรง หลีกเลี่ยงการสร้างชั้นเก็บข้อมูลเพิ่มเติม

ความเข้าใจของฉันถูกต้องหรือไม่?

IMO ความเข้าใจของคุณถูกต้องหากคุณใช้รูปแบบหน่วยงาน (เซสชันต่อคำขอตามที่คุณอธิบายในคำถาม) อย่างถูกต้อง นั่นคือวิธีที่มันควรจะทำงาน

เป็นไปได้ไหมที่จะมี Service Layer พร้อม DDD ในเว็บแอปดังกล่าว

ด้วย DDD โมเดลโดเมนของคุณจะมีตรรกะที่เกี่ยวข้องด้วย แต่มีตรรกะที่ไม่เกี่ยวข้องกับโมเดลโดเมนใดๆ เสมอ ตรรกะนั้นโดยทั่วไปใช้ในบริการ ใช่แล้ว คุณยังอาจต้องการบริการจาก DDD เพียงแค่นั้น มันจะไม่ประกอบด้วยตรรกะของคุณทั้งหมด เนื่องจากส่วนใหญ่จะอยู่ในโมเดล


ด้วย DDD ให้พิจารณาใช้ CQRS ด้วย CQRS คุณจะแยกการอ่านและเขียนไปยังที่เก็บข้อมูลของคุณ พื้นที่เก็บข้อมูลเป็นทางเลือกในกรณีนี้ ตามที่แนะนำข้างต้น คุณสามารถใช้ Generic Repository ที่เปิดเผยโดย ORM ได้

person Amit Joshi    schedule 28.12.2018

ฉันสงสัยว่าเราสามารถละเว้นการสร้าง Repository Layer ในกรณีนี้ได้หรือไม่

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

จะเป็นไปได้ไหมที่จะมี Service Layer ที่มี DDD ในเว็บแอปดังกล่าว

แน่นอนว่าคุณสามารถเก็บ Service Layer ไว้ได้ จริงๆ แล้วคุณสามารถเรียกมันว่า Application Layer ใน DDD ได้ แต่คุณต้องระมัดระวังสิ่งที่ควรรวมไว้ในเลเยอร์นี้

person YonF    schedule 28.12.2018