* Ekle / Oluştur komutları CQRS + Olay Kaynağı mimarisinde nasıl ele alınmalıdır?


11

İlk uygulamamı Olay Kaynağı ile birlikte CQRS kalıbını kullanarak uygulamak istiyorum. Agrega köklerinin oluşturulmasının nasıl düzgün bir şekilde ele alınması gerektiğini merak ediyorum. Birisinin CreateItem komutu gönderdiğini varsayalım. Nasıl ele alınmalı? ItemCreated etkinliği nerede saklanmalıdır? Yeni bir öğenin ilk etkinliği olarak? Yoksa tüm öğeleri bir araya getiren bir tür ItemList varlığı mı olmalı ve etkinlik listesi yalnızca ItemCreated olaylarından mı oluşuyor?

Udi Dahan , toplu kökler oluşturmamayı ve her zaman bunun yerine bir tür getirme yöntemi kullanmamayı önerir . Ama yeni ve kesinlikle herhangi bir kimliği atanmamış bir şeyi nasıl getirebilirim. Arkadaki fikri anlıyorum ve yeni bir nesnenin, durumu üzerinde sıfır olaydan oluşan bir nesne olduğunu düşünmek oldukça makul. Ama nasıl kullanmalıyım? Depomda farklı bir yöntem olmalı mı getNewItem()yoksa get(id)yöntemimi kabul etmeli Optional<ItemId>mi?

Düzenleme: Kazma bir süre sonra aktörler kullanarak yukarıda bahsedilen desenlerin gerçekten ilginç bir uygulama bulundu . Yazar, toplu oluşturmak yerine, yeni oluşturulan UUID ile bir tür depodan alır. Bu yaklaşımın dezavantajı, geçici bir tutarsızlık durumuna izin vermesidir. Ben de deleteböyle bir yaklaşımla yöntemi nasıl uygulayabileceğimi merak ediyorum . Toplamın etkinlik listesine Silinmiş etkinliği mi eklemeniz yeterlidir?


1
Udi'nin posta başlığının yanıltıcı olduğundan şüpheleniyorum. IMHO, asıl amacı, yeni yapılmış AR'lerin, yeni AR'nin neden oluşturulması gerektiğine / nasıl / kimin karar verdiğiyle ilgili bağlamı yakalayacak şekilde her zaman başka bir yerden erişilebilir olması gerektiğidir. Diğer her şey, belirli bir uygulamanın (NHibernate?) Yönetmeyi nasıl kolaylaştırabileceğiyle ilgilidir.
Darien

2
Başvurduğunuz Udi Dahan makalesinin özellikle tavsiyelerinin etkinlik kaynağı için geçerli olmayabileceğini unutmayın: udidahan.com/2009/06/29/dont-create-aggregate-roots/…
EZ Hart

Yanıtlar:


13

Udi'nin gönderisindeki fikir, topladığım gibi, ince havadan hiç bir şey görünmüyor. Öğenin oluşturulmasına neden olan (neredeyse) her zaman bir şey veya daha spesifik olarak bir alan adı işlemi vardır. Tıpkı Udi'nin siteye kaydolan bir ziyaretçiden doğan bir kullanıcı örneği gibi. Bu noktada ve bu sınırlı bağlamda Ziyaretçi IP adresi tarafından alınan toplam köküdür. Bu Ziyaretçi daha sonra, bu noktada bir kullanıcı olan yeni "öğe" yi, Kayıt adlı bir alan adı işlemi aracılığıyla oluşturur . Aynı şey önceki adım için de geçerlidir, bu da başka bir sınırlı bağlamdır: Yönlendiren, URL tarafından alınan ve ziyaretçinin doğduğu BroughtVisitorWithIp adlı bir alan adı işlemine sahip AR'dir .

Udi, silme konusunda da çok güzel yazıyor: http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ . Ana fikir, hiçbir şeyi silmemenizdir. Arkada her zaman yakalamak istediğimiz bir alan adı işlemi vardır. Silinmek yerine iptal edilen bir sipariş gibi. Oku, çok iyi bir gönderi.

Her iki hesaptaki ana nokta, DDD ve özellikle Olay Sağlama yapmak, hiçbir zaman doğrudan CRUD işlemleri yapmamanızdır. Kendinizi gerçekten sadece bazı verileri eklemeniz, güncellemeniz veya silmeniz gereken bir durumda bulursanız ve bunun arkasında gerçekten bir etki alanı işlemi yoksa, belki DDD ve Olay Kaynaklandırma bu sınırlı bağlam için uygun değildir . Tek bir sınırlı bağlam bir ilkeye bağlı kaldığı sürece bu ikisini istediğiniz gibi birleştirebilirsiniz. Bu şekilde, CRUD stili sınırlı bağlam, veritabanında bir satır oluşturabilir; bu, artık AR'yi alabileceğiniz ve oluşturmak zorunda kalmayacağınız başka bir sınırlı bağlamda varlık ve Toplam kök haline gelir.


2
"DDD ve Etkinlik Kaynaklandırma belki de bu sınırlı bağlama uygun değildir." DDD'nin amacını doğru anladınız. Her durumda sadece şeytanın zaferi için değil, sadece belirsiz kurallarla dolu karmaşık bir alanla uğraşmak gerektiğinde uygulanmalıdır. Şahsen, gerekliliklerin mantık tarafından yönlendirilmediği yasal yazılımlar için yaptım.
Yegor Chumakov

2
Yalnızca bu cümle için +1 "sınırlı bağlam için". :)
Songo

2
'Ekle' ve 'Oluştur' fiillerinin kullanımı + 1'i, eski ve iyi bir sekmeli veritabanı ile etkileşim açısından hala alan adınızı düşündüğünüzü kuvvetle düşündürmektedir. Alan adınızı / sınırlı içeriğinizi bilmeden bunun uygun olup olmadığını söyleyemem. Kalıcılığı görmezden gelin, önce alan adınıza özgü olan KOMUTLAR ve ETKİNLİKLER'e (INTENTIONS ve OUTCOMES) odaklanın, daha sonra yüz binlerce kez çözülmüş bir sorun olan durumun nasıl devam edeceği konusunda endişelenin.
Matt

"'Ekle' ve 'Oluştur' fiillerinin kullanımı, hâlâ iyi bir eski tablo veritabanıyla etkileşim açısından alan adınızı düşündüğünüz anlamına gelir" Hmmm. İçinde büyük bir 'Bir şey ekle' düğmesine sahip bir UI tasarımınız olduğunda, ne yazık ki, niyet budur; kelimenin tam anlamıyla yeni bir şey eklemek için. Genel olarak size katılıyorum, ancak burada veritabanı düzeyinde konuşmuyoruz, bazen Ekle veya Oluştur aslında kullanılacak doğru kelimelerdir.
designermonkey

1
@designermonkey Kullanıcı arayüzünde bu düğmeler olduğunda, arkalarında gerçekten bir alan adı işlemi var mı? Belki de, ancak 10 defadan 9'u, bu sınırlı bağlamda karmaşık bir alan adı işlemine gerçekten gerek yoktur. Ve saf CRUD operasyonu sadece saf bir CRUD operasyonudur ve bu şekilde ele alınmalıdır. Sadece etki alanı modelinin karmaşıklığına ihtiyaç duyulduğunda, kullanılmalıdır. Böylece farklı tasarım ilkeleri ile farklı sınırlı bağlamlar.
Tuukka Haapaniemi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.