Spesification dan Repository
Dengan menggunakan specification pattern kita dapat menulis code sebagai berikut :
IEnumerable<Customer> customers = CustomerRepository.AllMatching(CustomerSpecifications.IsGoldCustomer);
Jadi kita dapat mereuse spesifikasi dari domain dan menggunakannya pada repository sebagai metode untuk melakukan query.
Tetapi hal tersebut juga menimbulkan masalah. Repository kehilangan abstraksi. Isi dari spesifikasi sebenarnya adalah predikat.Nah jadi sebenarnya yg dilakukan oleh repository adalah meload semua entity dan menjalankan spesifikasi tersebut pada semua entity. Contohn nya untuk customer
Nah kompleksitasnya O(N). Kita harus melakukan iterasi pada setiap object customer. Blum lagi kita harus meload semuanya dari database.
Kontrak Repository juga menjadi lemah. Karena kita akan melewatkan spesifikasi sehingga nama method repo menjadi umum.
Query Object berbeda dengan Spesification meskipun berhubungan.
Composite specification. Menggabungkan spesifikasi sehingga mudah membentuk query object.