Klasik müşteri sınırlı bağlamına ve MakeCustomerPreferred
komutuna sahip olduğumu ve günlüğe kaydetme ve yetkilendirme gibi bazı çapraz kesme endişelerim olduğunu varsayalım. Bu kesişen sorunların üstesinden gelmenin yolu kapsamlı bir şekilde tartışılsa da, kullanıcı hakkında bilgi kaydetmek istediğimiz veya etki alanı olaylarında emri vermekten sorumlu olan hizmeti merak ediyorum.CQRS/ES sisteminde olayları yayınlayan hizmeti ve kullanıcıyı kaydetme
Örnek olay:
interface CustomerMadePreferred {
customerId: string,
issuingService: string,
issuingUser: string,
}
Örnek komut:
interface MakeCustomerPreferred {
customerId: string
}
biz veren kullanıcı ve hizmet detayları içerikten yoksun olacağını Yukarıdaki komutu kullanarak. İstemcinin, komutun bir parçası olarak issuingService
ve issuingUser
için değer sağlamasını talep edebiliriz, ancak sorun, genellikle istemci tarafından gönderilen komuttur ve bu durumda, istemcinin uygulamanın denetiminin dışında bir web tarayıcısı olduğunu varsayalım Kullanıcının komut içinde hangi değerleri gönderebileceğini kontrol edemeyiz. Ek olarak, bu değerleri genel olarak, Hizmetimiz bir ReSTful veya JSON Web API'sinin arkasındaysa, OAuth jetonları gibi şeyler kullanarak belirleyebiliriz. Bu bana birkaç açık stratejiyle yaklaşıyor.
Olası Stratejiler:
- komutla
issuingService
veissuingUser
ekleyin ve sonra auth bağlamdan belirlenen değerlere karşı onları doğrulamak. Bu, istemci tarafından verilen komutun, işleyici tarafından işlenenle aynı olmasını ve komut işleyicisi uygulamasının yalnızca bir komut parametresine ihtiyaç duyması ve hiçbir kimlik bağlamının geçmemesi açısından basit olmasını sağlar. - Özniteliği
issuingService
veissuingUser
auth bağlamından ve bu ayrıntıları, komut işleyicisine teslim edilen komutlara ekledik/ekledik. Bu, orijinal komutu veren istemcilerde daha kolay olur, ancak komutun sözleşmesi, komut işleyicisi ile istemci arasında biraz farklıdır. Örnek: - Auth içeriğini komut işleyicisine ayrı bir argüman olarak aktarın veya komut işleyicisi tarafından çağrılabilen bir hizmetten edinebilirsiniz. Bu, komutun sözleşmesini korur, ancak komut işleyici uygulamasını zorlaştırır.
seçeneklerim ve komut işleyicisi uygulanmasına işlevsel bir yaklaşım için izin görünüyor başlıca nedeni yönünde eğilim var. Belki de bazı seçeneklerden ayrılıyorum veya issuingService
ve issuingUser
dahil olmak üzere olaylarda gereksiz olabilecek bazı detaylara bakıyorum.
GÜNCELLEME: Bir alternatif olarak, oluşturulan bu ayrıntıları içermeyecek şekilde olabilir, opsiyon arama sağlar olayı CustomerMadePreferred ve bunun yerine işlemek ve bazı tür bir anahtar içerebilir ayrı CommandIssued
olayları yaydığını yayıncı bilgisini komut işleyici tarafından yayılan olaylarla ilişkilendirmek için kullanılabilir.
Teknik uygulamaya göre, aynı konu hakkında düşündüğümde planım, etkinliğe bazı meta veriler eklemektir. Böylece etkinlik bir alan adı olarak kalacaktır ancak içeriği tanımlamak için bazı teknik meta veriler ekleyebilirim. –
@jpierson 2. ve 3. arasında herhangi bir fark yoktur * şu kadarıyla komut, komut işleyicisi ile istemci arasında biraz farklıdır *, var mı? – guillaume31
@ guillaume31, 2 ve 3 arasındaki farklar belki de süptildir, ancak bunlar etrafında birim testi yazılması veya komuta türlerinin etrafındaki diğer yansıtıcı aletlerle ilgili nasıl bir şey olabileceği açısından büyük ölçüde etkilenecektir. Komut işleyici sınıflarının/işlevlerinin sözleşmesi de arasında etkilenecektir. – jpierson