Di mana kita menarik garis antara delegasi dan enkapsulasi logika bisnis? Tampak bagi saya bahwa semakin kita mendelegasikan, kita menjadi semakin anemia . Namun, delegasi juga mempromosikan penggunaan kembali dan kepala sekolah KERING. Jadi apa yang pantas untuk didelegasikan dan apa yang harus tetap dalam model domain kami?
Ambil keprihatinan berikut sebagai contoh:
Otorisasi . Haruskah objek domain bertanggung jawab untuk mempertahankan aturan kontrol aksesnya (seperti properti CanEdit) atau haruskah itu didelegasikan ke komponen / layanan lain yang semata-mata bertanggung jawab untuk mengelola akses, mis. IAuthorizationService.CanEdit (objek)? Atau haruskah itu kombinasi keduanya? Mungkin objek domain memiliki properti CanEdit yang mendelegasikan ke IAuthorizationService internal untuk melakukan pekerjaan yang sebenarnya?
Validasi . Diskusi yang sama seperti di atas berkaitan dengan validasi. Siapa yang memelihara aturan dan siapa yang bertanggung jawab untuk mengevaluasinya? Di satu sisi, keadaan objek harus milik objek itu dan validitas adalah keadaan tetapi kami tidak ingin menulis ulang kode yang digunakan untuk mengevaluasi aturan untuk setiap objek domain. Kita bisa menggunakan warisan dalam kasus ini ...
Penciptaan Obyek . Kelas pabrik versus metode pabrik versus 'memulai' sebuah instance. Jika kita menggunakan kelas pabrik yang terpisah, kita dapat mengisolasi dan merangkum logika penciptaan tetapi dengan mengorbankan membuka objek objek kita ke pabrik. Ini dapat dikelola jika lapisan domain kami berada dalam rakitan terpisah dengan memaparkan konstruktor internal yang digunakan oleh pabrik tetapi ini menjadi masalah jika ada beberapa pola pembuatan. Dan, jika semua pabrik lakukan adalah memanggil konstruktor yang tepat, apa gunanya memiliki pabrik?
Metode pabrik di kelas menghilangkan masalah dengan membuka keadaan internal objek tetapi karena mereka statis, kami tidak dapat memecah ketergantungan melalui injeksi antarmuka pabrik seperti yang kami bisa dengan kelas pabrik terpisah.
Ketekunan . Orang dapat berargumen bahwa jika objek domain kita akan mengekspos CanEdit sambil mendelegasikan tanggung jawab untuk melakukan pemeriksaan otorisasi kepada pihak lain (IAuthorizationService) mengapa tidak memiliki metode Simpan pada objek domain kita yang melakukan hal yang sama? Ini akan memungkinkan kita untuk mengevaluasi keadaan internal objek untuk menentukan apakah operasi dapat dilakukan tanpa melanggar enkapsulasi. Tentu saja mengharuskan kami menyuntikkan instance repositori ke objek domain kami, yang baunya sedikit bagi saya, jadi apakah kami akan memunculkan event domain dan mengizinkan pawang untuk melakukan operasi persisten?
Lihat ke mana saya akan pergi dengan ini?
Rockford Lhotka memiliki diskusi besar tentang alasannya untuk pergi rute Class-in-Charge untuk kerangka CSLA-nya dan saya memiliki sedikit sejarah dengan kerangka kerja itu dan dapat melihat idenya tentang objek bisnis yang sejajar dengan objek domain dalam banyak cara. Tetapi mencoba menjadi lebih taat pada cita-cita DDD yang baik, saya bertanya-tanya kapan kolaborasi menjadi terlalu banyak.
Jika saya berakhir dengan IAuthorizationService, IValidator, IFactory dan IRepository untuk root agregat saya, apa yang tersisa? Apakah memiliki metode Publikasikan yang mengubah keadaan objek dari Draf ke Diterbitkan cukup untuk mempertimbangkan kelas sebagai objek domain non-anemia?
Pikiran Anda?