tl; dr - gerekiyorsa kuralları çiğneyin. DDD tüm sorunları çözemez; aslında verdiği nesne fikirleri iyi tavsiye ve iyi bir başlangıç, ancak bazı iş sorunları için gerçekten kötü seçimlerdir. Bir şeyin nasıl yapılacağına dair bir ipucu olarak düşünün.
Tüm çocukları (işlem) ebeveynle (hesap) yükleme sorunu için - Birçok ORM'nin çözdüğü n + 1 sorununda (google'a bir şey) karşılaştığınız anlaşılıyor.
Çocukları tembel yükleyerek (işlem) - sadece gerektiğinde çözebilirsiniz.
Ama zaten bildiğiniz gibi sesler, sorunu çözmek için bir TransactionRepository kullanabileceğinizi söyleyerek.
Bu verileri yalnızca Hesap'ın kullanabilmesi için 'gizlemek' için, herkese açık bir ilişkisel tablo gibi, başkalarının nasıl serileştirilmeyeceği bir yerde saklamanız gerekmez. Bir belge DB'sinde hesabın 'belge' ile depolanmasını sağlayabilirsiniz. Her iki durumda da birileri yeterince denerse, verileri hala görebiliyordu. Ve onunla 'çalış'. Ve bakmadığın zaman, yapacaklar!
Böylece izinler ayarlayabilirsiniz, ancak daha sonra, 'hesap'ı ayrı bir işlem olarak çalıştırmanız gerekir.
Burada gerçekten fark ettiğiniz şey, DDD'nin ve nesne modelinin saf kullanımının bazen sizi bir köşeye geri getireceğidir. Doğrusu, elbette, DDD'nin tasarım ilkelerinden yararlanmak için 'kompozisyon' / agrega kökü kullanmak zorunda değilsiniz. Kısıtlamalarına uyan bir durum olduğunda kullanabileceğiniz sadece bir şey.
Birisi 'erken optimizasyon yapma' diyebilir. Ancak bu durumda, cevabı biliyorsunuz - hepsini sonsuza kadar hesapla tutacak bir yöntemi bozmak için yeterli işlem olacak.
Asıl cevap SOA'yı ayağa kalkmaya başlamak. İşyerimde Udi Dahan 'Dağıtılmış bilgi işlem' videolarını izledik ve nServiceBus'u satın aldık (sadece bizim tercihimiz). Hesaplar için bir hizmet yapın - kendi işlemi, mesaj kuyrukları, yalnızca görebildiği bir ilişki veritabanına erişim ve ... viola, programdaki SQL ifadelerini kodlayabilir ve hatta birkaç Cobol işlem komut dosyası (şaka) atabilirsiniz ancak ciddi olarak endişelerin en akıllı OO / Java züppesinin hayal edebileceğinden daha fazla ayrılması.
Yine de iyi modelleme tavsiye ederim; hizmeti mini sınırlı bir sayı olarak ele alarak sorunsuz bir şekilde burada toplam kökün avantajlarına sahip olabilirsiniz.
Elbette bunun bir dezavantajı var. Hizmetlerin içinde ve dışında sadece RPC'yi (webservice, SOAP veya REST) ve aralarında veya geçici bağlantı nedeniyle 'düğüm' adı verilen bir SOA antipattern'i elde edemezsiniz. Olay düzenleyicileri ve olay yükselticileri gibi, ancak (1) süreçler arasında (biri aşırı yükleniyorsa ayrı makinelere koyabileceğiniz) iletişim düzeni, yani 'Pub-Sub' in tersini kullanmalısınız.
asıl mesele, 'engellemek' veya beklemek için başka bir hizmetten veri alması gereken bir hizmet istemiyorsunuz - mesajı ateşlemeniz ve unutmanız ve programınızın başka bir yerindeki bir işleyicinin işlemi tamamlamak için alması gerekiyor. Bu, mantığınızı farklı yapmanız gerektiği anlamına gelir. nServicebus, bunlara yardımcı olmak için 'destan' desenini otomatikleştirir, ancak sonunda farklı bir kodlama stili geliştirmeniz gerekir. Her şeyi hala yapabilirsiniz, sadece farklı yapmak zorundasınız!
Arnon Rotem-Gal-Oz'un "SOA Patterns" kitabı bu konuda birçok soruyu yanıtlıyor. İhtiyaç duyulduğunda dışarıdaki servislerden verileri kendinize periyodik olarak çoğaltmak için 'aktif hizmet kalıbı' kullanımını da dahil etmek (birçok RPC gerekli olurdu veya yayınlama / abone olma ekosisteminde bağlantı güvenilir değil / değil).
Sadece önizleme için, UI yok hizmetlerine RPC gerekiyor. Raporlar, hizmetlerin veritabanları tarafından beslenen bir raporlama veritabanından oluşturulur. Bazı insanlar raporlara ihtiyaç olmadığını ve sorunun başka bir şekilde çözülmesi gerektiğini söylüyor. Bu konuşma hakkında şüpheci olun.
Sonunda, her şey düzgün bir şekilde tek bir hizmette sınıflandırılamaz. Dünya mantı koduyla koşmuyor! Yani kuralları çiğnemek zorunda kalacaksınız. Asla zorunda kalmasanız bile, projeye yeni geliştiriciler bunu terk ettiğinizde yapacaklardır. Ancak endişelenmeyin, elinizden geleni yaparsanız, kuralları takip eden% 85'i çok daha sürdürülebilir bir program yapar.
Vay be, çok uzundu.