Sorunlu alanın kısa bir gözden geçirmesiyle başlayalım: DDD'nin temel ilkelerinden biri, iş kurallarını, uygulanması gereken yerlere mümkün olduğunca yakın yerleştirmektir. Bu son derece önemli bir kavram çünkü sisteminizi daha "uyumlu" kılıyor. Kuralların "yukarı doğru" hareket ettirilmesi genellikle anemik bir modelin işaretidir; burada nesneler sadece veri torbalarıdır ve uygulanacak verilerle kurallar uygulanır.
Anemik bir model DDD ile yeni başlayan geliştiriciler için çok anlamlı olabilir. Bir User
model ve EmailMustBeUnqiueRule
e-postayı doğrulamak için gerekli bilgiler enjekte edilen bir model oluşturursunuz . Basit. Zarif. Sorun şu ki, bu "tür" düşünce, doğada temel olarak prosedüreldir. DDD değil. Ortaya çıkan şey, düzinelerce Rules
düzgün bir şekilde sarılmış ve kapsüllenmiş bir modülle kalmanızdır , ancak artık değiştirilemeyecekleri noktaya tamamen bağlamsızdırlar, çünkü ne zaman / nerede uygulandıkları açık değildir. bu mantıklı mı? Bu olabilir apaçık bir o olmak EmailMustBeUnqiueRule
bir oluşturulmasına ilişkin uygulanacak User
hakkında, ama ne UserIsInGoodStandingRule
?. Yavaş ama emin adımlarla,Rules
onların bağlamı dışında sizi anlamak zor (ve bu yüzden değiştirilemez) bir sistem bırakır. Kurallar, yalnızca gerçek crunching / yürütme o kadar ayrıntılı olduğunda kapsüllenmelidir; modeliniz odaklanmaya başlar.
Şimdi özel sorunuza: Service
/ CommandHandler
atmakla ilgili sorun Exception
, iş mantığınızın alan adınızdan sızmaya ("yukarı") başlamasıdır. Bir e-postanızı neden bilmeniz Service
/ CommandHandler
bilmeniz gerekiyor? Uygulama hizmet katmanı genellikle uygulama yerine koordinasyon için kullanılır. Bunun nedeni ChangeEmail
, sisteminize bir yöntem / komut eklersek gösterilebilir . Şimdi, BOTH yöntemlerinin / komut işleyicilerinin benzersiz çekinizi içermesi gerekir. Bu, bir geliştiricinin anı "çıkarmak" için cazip gelebileceği yerdir EmailMustBeUniqueRule
. Yukarıda açıklandığı gibi, o rotaya gitmek istemiyoruz.
Bazı ek bilgi sıkıntıları bizi daha fazla DDD cevabına götürebilir. Bir e-postanın benzersizliği, bir User
nesne koleksiyonunda uygulanması gereken bir değişmezdir . Alan adınızda " User
nesne koleksiyonu" nu temsil eden bir kavram var mı ? Sanırım buraya nereye gittiğimi görebiliyorsunuz.
Bu özel durum için (ve koleksiyonlar arasında değişmezlerin zorla uygulanmasını içeren birçok) bu mantığı uygulamak için en iyi yer sizin olacaktır Repository
. Bu özellikle kullanışlıdır, çünkü Repository
bu tür bir doğrulamayı (veri deposu) yürütmek için gerekli ekstra altyapıyı da "bilir". Sizin durumunuzda, bu kontrolü add
yönteme yerleştiririm. Bu mantıklı mı? Kavramsal olarak, User
sisteminize gerçekten a ekleyen bu yöntemdir . Veri deposu bir uygulama ayrıntısıdır.