Saya berasal dari dunia skrip transaksi dan saya baru mulai melihat DDD. Saya tidak yakin tentang cara yang benar untuk mengintegrasikan desain DDD dengan kegigihan basis data. Inilah yang saya miliki:
Kelas layanan yang disebut OrganisationService yang antarmukanya berisi metode untuk mengambil dan menyimpan contoh objek domain Organisasi. Organisasi adalah akar agregat dan memiliki data lain yang terkait dengannya: Anggota dan Lisensi. DBContextext database pertama EF6 digunakan dalam OrganisationService untuk mengambil entitas OrganisationDB dan entitas MemberDB dan LicenseDB yang terkait. Ini semua bisa ditransformasikan menjadi setara kelas objek domain mereka ketika diambil oleh OrganisationService dan dimuat ke objek domain organisasi. Objek ini terlihat seperti ini:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Saya tidak menggunakan pola Repositori di OrganisationService ... Saya menggunakan EF itu sendiri sebagai Repositori karena sepertinya EF6 telah membuat repositori secara berlebihan sekarang.
Pada titik ini dalam desain objek domain Organisasi adalah anemia: terlihat seperti kelas Organisasi EF POCO. Kelas OrganisationService sangat mirip dengan Repositori!
Sekarang saya harus mulai menambahkan logika. Logika ini termasuk mengelola Lisensi dan Anggota Organisasi. Sekarang di hari-hari skrip transaksi saya akan menambahkan metode ke dalam OrganisationService untuk menangani operasi ini dan memanggil ke dalam Repositori untuk berinteraksi dengan DB, tetapi dengan DDD saya percaya logika ini harus dienkapsulasi dalam objek domain Organisasi itu sendiri ...
Di sinilah saya tidak yakin dengan apa yang harus saya lakukan: Saya perlu mempertahankan data ini kembali ke database sebagai bagian dari logika. Apakah ini berarti saya harus menggunakan DbContext dalam objek domain Organisasi untuk melakukan ini? Apakah menggunakan repositori / EF dalam praktik buruk objek domain? Jika demikian, di manakah kegigihan ini?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Haruskah saya hanya bermutasi objek domain Organisasi dalam memori dan kemudian mendorongnya kembali ke OrganisationService untuk kegigihan? Lalu saya harus melacak apa yang sebenarnya berubah pada objek (yang dilakukan EF terhadap POCO-nya sendiri! Saya agak merasa bahwa EF bukan hanya pengganti repositori, tetapi juga bisa menjadi lapisan domain!)
Bimbingan apa pun di sini sangat dihargai.
sumber
saya tidak tahu EF6 tetapi ORM lain menangani ini secara transparan sehingga Anda tidak perlu menambahkan lisensi ke konteks secara eksplisit, itu akan mendeteksi mereka ketika menyimpan perubahan. Jadi metodenya akan turun ke
dan kode di sekitarnya
sumber