แบบจำลองโดเมนแอนดี้และการฉีดบริการโดเมน


19

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

ในความคิดของฉันความคิดเห็นเหล่านั้นขัดแย้งกันจริงหรือไม่? จะพิจารณาทั้งสองประเด็นได้อย่างไร

มันเป็นรูปแบบโดเมนที่สมบูรณ์จริง ๆกับบริการโดเมนฉีดกับแบบจำลองโดเมน anemic และบริการโดเมนปกติหรือไม่


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

2
@MetaFight: แม้ว่ากระบวนการทางธุรกิจจะส่งผลกระทบต่อหลายเอนทิตีในวิธีที่ซับซ้อน แต่คุณสามารถทำได้โดยไม่ต้องให้บริการที่มีรูปแบบโดเมนรูทรวมที่ดีนั่นคือรูปแบบโดเมนที่มีสิทธิ์เข้าถึงเอนทิตีที่ได้รับผลกระทบทั้งหมด
Greg Burghardt

นั่นเหมาะสมแล้ว :)
MetaFight

คำตอบ:


16

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

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

การหลีกเลี่ยงทั้ง "บอก" นำไปสู่การออกแบบที่แข็งแกร่ง คุณมีบางอย่างในบริการที่โมเดลต้องการหรือไม่? บางทีมันควรจะถูกย้ายไปที่โมเดล หากไม่เป็นเช่นนั้นคุณควรพิจารณาข้อกังวลของคุณอีกครั้ง พฤติกรรมของโมเดลควรทำงานภายในโมเดล มันควรส่วนใหญ่ (ถ้าไม่เพียง แต่) กังวลตัวเองกับสมาชิก แต่จำไว้ว่าจะยังคงมีสิ่งที่ทำงานในหรือมีรูปแบบ ตัวอย่างเช่นโมเดลไม่ควรเปิดการเชื่อมต่อ TCP หรือรับฟังเหตุการณ์ UI แม้ว่าจะเกี่ยวข้องกันก็ตาม นั่นคือความรับผิดชอบของคนอื่นและคนที่ไม่เคยอยู่ในโมเดล


7
ความแตกต่างที่ดีที่ฉันจำได้คือโมเดลโดเมนของคุณใช้ตรรกะทางธุรกิจและบริการโดเมนของคุณจะใช้ตรรกะทางธุรกิจในโมเดลโดเมน ความแตกต่างคือใครโทรมาใคร บริการต่าง ๆ สามารถเรียกวิธีการของ Domain Model ได้ หากรูปแบบโดเมนกำลังเรียกวิธีการบริการคุณได้พลิกรูปแบบที่ด้านบนของหัวของมัน
Greg Burghardt

7

มันไม่ขัดแย้ง ผู้สนับสนุนทั้งสองต้องการให้คุณใส่รหัสที่แท้จริงของคุณลงในวัตถุโดเมน

กล่าวคือ

public class Order
{
    private string status = "not bought";
    public void Buy()
    {
        this.status = "bought";
    }
}

เทียบกับ ADM

public class Order
{
    public string Status = "not bought";
}

public class BuyingService
{
    public Order Buy(Order order)
    {
         Order o = new Order();
         o.status = "bought";
         return o;
    }
}

บริการการฉีด

public class Order
{
    public Order(IBuyingService bs)
    {
        _bs = bs;
    }
    private IbuyingService _bs;
    private string status = "not bought";
    public void Buy()
    {
        this.status = _bs.Buy();
    }
}

public class BuyingService : IBuyingService
{
    public string Buy()
    {
         return = "bought";
    }
}

ตรงไปตรงมาแม้ว่าแต่ละวิธีมีข้อดีและข้อเสีย คนที่คุณเลือกนั้นเป็นเรื่องของการตั้งค่าส่วนตัว

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