Anladığım kadarıyla, CQRS'nin arkasındaki büyük fikir, komutları ve sorguları işlemek için 2 farklı veri modeline sahip olmak. Bunlara "model yazma" ve "model okuma" denir.
Twitter uygulama klonunun bir örneğini ele alalım. İşte komutlar:
- Kullanıcılar kendilerini kaydedebilirler.
CreateUserCommand(string username)
yayarUserCreatedEvent
- Kullanıcılar diğer kullanıcıları takip edebilir.
FollowUserCommand(int userAId, int userBId)
yayarUserFollowedEvent
- Kullanıcılar yayın oluşturabilir.
CreatePostCommand(int userId, string text)
yayarPostCreatedEvent
Yukarıdaki "etkinlik" terimini kullanırken, "etkinlik kaynak bulma" etkinliklerinden bahsetmiyorum. Sadece okuma modeli güncellemelerini tetikleyen sinyalleri kastediyorum. Bir etkinlik mağazam yok ve şimdiye kadar CQRS'nin kendisine odaklanmak istiyorum.
Ve işte sorgular:
- Bir kullanıcının yayınlarının listesini görmesi gerekir.
GetPostsQuery(int userId)
- Bir kullanıcının takipçilerinin listesini görmesi gerekir.
GetFollowersQuery(int userId)
- Bir kullanıcının takip ettiği kullanıcıların listesini görmesi gerekir.
GetFollowedUsersQuery(int userId)
- Bir kullanıcının "arkadaş özet akışını" görmesi gerekir - tüm arkadaşlarının etkinliklerinin bir günlüğü ("arkadaşınız John yeni bir gönderi oluşturdu").
GetFriedFeedRecordsQuery(int userId)
Bu CreateUserCommand
tür bir kullanıcının zaten var olup olmadığını bilmek gerekir. Bu noktada, yazma modelimin tüm kullanıcıların bir listesine sahip olması gerektiğini biliyorum.
İşlemek için FollowUserCommand
ben userA zaten userB izler olup olmadığını bilmek gerekir. Bu noktada yazma modelimin tüm kullanıcı-takip-kullanıcı bağlantılarının bir listesini olmasını istiyorum.
Ve son olarak, CreatePostCommand
başka bir şeye ihtiyacım olduğunu düşünmüyorum, çünkü benim gibi komutlarım yok UpdatePostCommand
. Bunlara sahip olsaydım, yazının var olduğundan emin olmalıyım, bu yüzden tüm yayınların bir listesine ihtiyacım olacaktı. Ancak bu gereksinime sahip olmadığım için, tüm yayınları izlememe gerek yok.
Soru # 1 : "Yazım modeli" terimini kullandığım şekilde kullanmak doğru mu? Yoksa "yazma modeli" ES durumunda her zaman "etkinlik deposu" anlamına mı gelir? Eğer öyleyse, komutları işlemem gereken veriler ile sorguları işlemem gereken veriler arasında herhangi bir ayrım var mı?
İşlemek için GetPostsQuery
tüm yayınların bir listesine ihtiyacım var. Bu, okuma modelimin tüm yayınların bir listesine sahip olması gerektiği anlamına gelir. Dinleyerek bu modeli koruyacağım PostCreatedEvent
.
Her iki işlemek için GetFollowersQuery
ve GetFollowedUsersQuery
ben kullanıcılar arasındaki tüm bağlantıların bir listesini gerekir. Bu modeli korumak için dinleyeceğim UserFollowedEvent
. İşte bir Soru # 2 : Burada yazma modelinin bağlantı listesini kullanırsam pratikte sorun olmaz mı? Ya da ayrı bir okuma modeli oluşturmalıyım, çünkü gelecekte yazma modelinden daha fazla ayrıntıya sahip olmak isteyebilir miyim?
Son olarak, işlemek GetFriendFeedRecordsQuery
için:
- Dinlemek
UserFollowedEvent
- Dinlemek
PostCreatedEvent
- Hangi kullanıcıların hangi kullanıcıları takip ettiğini bilin
A kullanıcısı B kullanıcısını takip ederse ve B kullanıcısı C kullanıcısını takip etmeye başlarsa, aşağıdaki kayıtlar görünmelidir:
- A kullanıcısı için: "Arkadaş B kullanıcısı C kullanıcısını izlemeye yeni başladı"
- B kullanıcısı için: "C kullanıcısını yeni kullanmaya başladınız"
- C kullanıcısı için: "B kullanıcısı sizi takip ediyor"
İşte Soru # 3 : Bağlantıların listesini almak için hangi modeli kullanmalıyım? Yazma modelini kullanmalı mıyım? Okuma modeli kullanmalı mıyım - GetFollowersQuery
/ GetFollowedUsersQuery
? Ya da GetFriendFeedRecordsQuery
modelin UserFollowedEvent
tüm bağlantılar listesini kendi idare etmesini ve korumasını sağlamalı mıyım ?