Saya masih ingat masa lalu yang baik dari repositori. Tetapi repositori digunakan untuk tumbuh jelek seiring waktu. Kemudian CQRS menjadi arus utama. Mereka baik, mereka menghirup udara segar. Tetapi baru-baru ini saya telah berulang kali bertanya pada diri sendiri mengapa saya tidak menjaga logika dengan benar dalam metode Action Controller's (terutama di Web Api di mana action adalah semacam command / query handler itu sendiri).
Sebelumnya saya punya jawaban yang jelas untuk itu: Saya melakukannya untuk pengujian karena sulit untuk menguji Controller dengan semua lajang yang tidak dapat diejek dan infrastruktur ASP.NET yang jelek secara keseluruhan. Tetapi waktu telah berubah dan kelas infrastruktur ASP.NET jauh lebih ramah unit test (terutama di ASP.NET Core).
Inilah panggilan WebApi yang khas: perintah ditambahkan dan klien SignalR diberitahu tentang hal itu:
public void AddClient(string clientName)
{
using (var dataContext = new DataContext())
{
var client = new Client() { Name = clientName };
dataContext.Clients.Add(client);
dataContext.SaveChanges();
GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
}
}
Saya dapat dengan mudah menguji unit / mengejeknya. Terlebih lagi, berkat OWIN saya dapat mensetup server WebApi dan SignalR lokal dan membuat tes integrasi (dan cukup cepat).
Baru-baru ini saya merasa semakin kurang motivasi untuk membuat penangan Perintah / Pertanyaan rumit dan saya cenderung untuk menjaga kode dalam tindakan Web Api. Saya membuat pengecualian hanya jika logika diulang atau itu benar-benar rumit dan saya ingin mengisolasinya. Tetapi saya tidak yakin apakah saya melakukan hal yang benar di sini.
Apa pendekatan yang paling masuk akal untuk mengelola logika dalam aplikasi ASP.NET modern yang khas? Kapan masuk akal untuk memindahkan kode Anda ke Penangan Perintah dan Pertanyaan? Apakah ada pola yang lebih baik?
Memperbarui. Saya menemukan artikel ini tentang pendekatan DDD-lite. Jadi sepertinya pendekatan saya memindahkan bagian kode yang rumit ke command / queries handler bisa disebut CQRS-lite.
Jawaban:
Apakah CQRS merupakan pola yang relatif rumit dan mahal? Iya.
Apakah ini rekayasa berlebihan? Benar-benar tidak.
Dalam artikel asli tempat Martin Fowler berbicara tentang CQRS, Anda dapat melihat banyak peringatan tentang tidak menggunakan CQRS yang tidak berlaku:
Penekanan saya di atas.
Jika aplikasi Anda menggunakan CQRS untuk semuanya, maka bukan CQRS yang direkayasa berlebihan, melainkan aplikasi Anda. Ini adalah pola yang sangat baik untuk menyelesaikan beberapa masalah khusus, terutama aplikasi berkinerja tinggi / volume tinggi di mana penulisan concurrency mungkin menjadi perhatian utama.
Dan itu mungkin bukan keseluruhan aplikasi, tetapi hanya sebagian kecil saja.
Sebagai contoh langsung dari pekerjaan saya, kami menggunakan CQRS dalam sistem Entry Order, di mana kami tidak dapat kehilangan pesanan, dan kami memiliki lonjakan di mana ribuan pesanan datang pada saat yang sama dari sumber yang berbeda, dalam beberapa jam tertentu. CQRS membantu kami untuk menjaga sistem tetap hidup dan responsif, sambil memungkinkan kami untuk skala baik sistem backend untuk memproses pesanan ini lebih cepat bila diperlukan (server backend lebih) dan lebih lambat / lebih murah bila tidak diperlukan.
CQRS sangat cocok untuk masalah di mana Anda memiliki beberapa aktor berkolaborasi dalam set data yang sama atau menulis ke sumber daya yang sama.
Selain itu, menyebarkan pola yang dibuat untuk memecahkan satu masalah untuk semua masalah Anda hanya akan menciptakan lebih banyak masalah bagi Anda.
Beberapa tautan bermanfaat lainnya:
http://udidahan.com/2011/04/22/when-to-avoid-cqrs/
http://codebetter.com/gregyoung/2012/09/09/cqrs-is-not-an-architecture-2/
sumber
CQRS bukan pengganti satu-untuk-satu untuk Repositori, justru karena itu adalah pola yang rumit dan mahal yang hanya berguna dalam beberapa kasus.
Inilah yang dikatakan Udi Dahan dalam arti pantas:
( sumber )
Martin Fowler:
( sumber )
Akhirnya, Greg Young:
( sumber )
sumber