Biarkan saya mulai dengan terlebih dahulu meminta maaf atas panjang posting, tapi saya benar-benar ingin menyampaikan detail sebanyak-banyaknya di muka sehingga saya tidak meluangkan waktu untuk bolak-balik dalam komentar.
Saya merancang aplikasi mengikuti pendekatan DDD dan saya bertanya-tanya panduan apa yang dapat saya ikuti untuk menentukan apakah Agregat Root harus mengandung AR lain atau jika harus dibiarkan terpisah, "berdiri bebas" AR.
Ambil contoh aplikasi Jam Waktu sederhana yang memungkinkan Karyawan untuk masuk atau keluar pada hari itu. UI memungkinkan mereka untuk memasukkan ID dan PIN karyawan mereka yang kemudian divalidasi dan status karyawan saat ini diambil. Jika karyawan saat ini clock-in, UI menampilkan tombol "Clock Out"; dan, sebaliknya, jika tidak clock-in, tombol bertuliskan "Clock In". Tindakan yang diambil oleh tombol sesuai dengan keadaan karyawan juga.
Aplikasi ini adalah klien web yang memanggil server back-end yang diekspos melalui antarmuka layanan RESTful. Pass pertama saya dalam membuat URL intuitif dan dapat dibaca menghasilkan dua titik akhir berikut:
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
CATATAN: Ini digunakan setelah ID dan PIN karyawan divalidasi dan "token" yang mewakili "pengguna" diteruskan dalam header. Ini karena ada "mode manajer" yang memungkinkan manajer atau penyelia untuk masuk atau keluar karyawan lain. Tetapi, demi diskusi ini, saya berusaha membuatnya tetap sederhana.
Di server, saya memiliki ApplicationService yang menyediakan API. Ide awal saya untuk metode ClockIn adalah sesuatu seperti:
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
Ini terlihat cukup mudah hingga kami menyadari bahwa informasi kartu waktu Karyawan sebenarnya disimpan sebagai daftar transaksi. Itu berarti setiap kali saya memanggil ClockIn atau ClockOut, saya tidak secara langsung mengubah status Karyawan tetapi, sebaliknya, saya menambahkan entri baru ke dalam TimeSheet Karyawan. Keadaan Karyawan saat ini (clocked in or not) berasal dari entri terbaru dalam TimeSheet.
Jadi, jika saya menggunakan kode yang ditunjukkan di atas, repositori saya harus mengenali bahwa properti yang tetap dari Karyawan tidak berubah tetapi bahwa entri baru ditambahkan ke TimeSheet Karyawan dan melakukan penyisipan ke dalam penyimpanan data.
Di sisi lain (dan inilah pertanyaan utama dari pos), TimeSheet sepertinya itu adalah Agregat Root dan juga memiliki identitas (ID dan periode karyawan) dan saya bisa dengan mudah menerapkan logika yang sama dengan TimeSheet.ClockIn (identitas pegawai).
Saya menemukan diri saya memperdebatkan manfaat dari dua pendekatan dan, sebagaimana dinyatakan dalam paragraf pembukaan, bertanya-tanya kriteria apa yang harus saya evaluasi untuk menentukan pendekatan mana yang lebih cocok untuk masalah tersebut.