Model domain anemia dan injeksi layanan domain

19

The model domain anemia digambarkan sebagai anti-pola dalam domain desain didorong oleh Martin Fowler. Untuk memiliki logika bisnis pada model domain sering layanan domain digunakan. Tetapi menyuntikkan layanan domain ke dalam model domain dianggap berbahaya oleh Vaughn Vernon (lihat "Menerapkan Desain Berbasis Domain, Halaman 387).

Menurut saya, pendapat itu kontradiktif, apakah ini benar? Bagaimana kedua poin dipertimbangkan?

Apakah benar - benar model domain yang kaya dengan layanan domain yang disuntikkan vs model domain anemia dan layanan domain normal ?

Sjoerd222888
sumber
4
Saya sama sekali tidak ahli dalam hal ini, tetapi saya pikir jenis logika yang masuk ke layanan domain dan ke entitas domain pada dasarnya berbeda. Logika yang masuk ke Entitas adalah logika yang diperlukan untuk menjaga objek dalam keadaan yang benar. Ini melibatkan validasi dan transformasi logika. Layanan domain, di sisi lain, adalah untuk logika tingkat yang lebih tinggi. Jadi, misalnya, layanan domain akan memodelkan proses bisnis yang melibatkan berbagai jenis entitas adalah cara yang kompleks.
MetaFight
2
@MetaFight: Sekalipun proses bisnis memengaruhi banyak entitas dengan cara yang rumit, Anda dapat mencapainya tanpa layanan yang diberikan model domain Agregat Root yang bagus, yaitu model domain yang memiliki akses ke semua entitas yang terpengaruh sebagai properti atau bidang pada dirinya sendiri.
Greg Burghardt
Itu masuk akal :)
MetaFight

Jawaban:

16

Model anemia hanyalah sebuah wadah data. Itu tidak mengandung perilaku. (Ini sebenarnya bisa dianggap sebagai hal yang baik dalam paradigma fungsional.) Kebalikan dari model anemia bukanlah model yang disuntikkan penuh layanan domain. Anda menggambarkan dua ekstrem - keduanya buruk.

Jika Anda memiliki model anemia, Anda tidak sepenuhnya memahami apa yang ditawarkan OOP. Jika Anda mulai menyuntikkan layanan ke dalam model-model itu, Anda kemungkinan menyuntikkan masalah yang bukan miliknya. Entah itu atau model Anda lebih anemia daripada yang Anda pikirkan. Kenapa lagi Anda membutuhkan layanan selain menyediakan sesuatu yang diperlukan tetapi tidak ada? (Hilang bisa berarti anemia.)

Menghindari "menceritakan" mengarah ke desain yang lebih kuat. Apakah Anda memiliki sesuatu dalam layanan yang dibutuhkan model? Mungkin itu harus dipindahkan ke model. Jika tidak, mungkin Anda harus mempertimbangkan kembali kekhawatiran Anda. Perilaku model harus bekerja di dalam model. Ini terutama harus (jika tidak hanya) berkaitan dengan anggota. Tetapi ingat, masih akan ada hal-hal yang bekerja pada atau dengan model. Misalnya, model tidak boleh membuka koneksi TCP atau mendengarkan acara UI, bahkan jika mereka terlibat. Itu tanggung jawab orang lain dan bahwa seseorang tidak pernah termasuk dalam model.

Hanya sedikit Roger
sumber
7
Perbedaan yang baik yang ingin saya ingat adalah bahwa Model Domain Anda mengimplementasikan logika bisnis, dan Layanan Domain Anda menjalankan logika bisnis pada Model Domain. Perbedaannya adalah siapa yang memanggil siapa. Layanan dapat memanggil metode Model Domain. Jika Model Domain memanggil metode Layanan, Anda telah membalik pola di atas kepalanya.
Greg Burghardt
7

Itu tidak bertentangan. Kedua pendukung menginginkan Anda untuk meletakkan kode Anda yang sebenarnya di objek domain itu sendiri.

yaitu.

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

vs 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;
    }
}

vs layanan yang disuntikkan

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";
    }
}

Terus terang setiap pendekatan memiliki kelebihan dan kekurangan. Yang Anda pilih sebagian besar adalah masalah preferensi pribadi

Ewan
sumber