2011-12-06 15 views
10

मेरे पास दो कुल जड़ों और एक नियमित इकाई का एक सरल परीक्षा डोमेन है। Tenant, UserGroup और User जहां इस विशेष नमूने में Tenant और User दो AggregateRoots के लिए बनाते हैं।डोमेन इवेंट हैंडलर कब खेलते हैं?

जब यूआई/सेवा परत से कमांड प्राप्त होता है तो यह कमांड हैंडलर तक पहुंचता है जो केवल डोमेन लिखता है।

आप कह सकते हैं कि User एक AggregateRoot बिल्कुल लेकिन जब से यह दूसरों के द्वारा संदर्भित किया जाएगा होना चाहिए नहीं है, यह एक नियमित रूप से इकाई नहीं हो सकता। (हाँ?)

इन दो समग्र रूट्स को संवाद करने की आवश्यकता है। User को UserGroup से संबंधित के बिना बनाया नहीं जा सकता है, जो Tenant के बाध्य संदर्भ में एक इकाई है। संभवतः, हम बना सकते हैं, क्योंकि यह एक साधारण बाधा है, निर्माता के माध्यम से एक उपयोगकर्ता। User.Create(TenantId, UserGroupId)

यह DomainEvent उत्पन्न करता है दिनांक, समेकितवर्सन और समेकित आईडी (उपयोगकर्ता का)। अब हम धुंधले हिस्सों में आते हैं।

इस घटना को स्टोर में खोलना खोलें, यह घटना बस (स्मृति, जो कुछ भी) पर प्रसारित की जाती है। यह वह बिंदु है जहां कमांड हैंडलर के समान डोमेन के ईवेंट हैंडलर, UserId जोड़ने के लिए उपयोगकर्ता को बनाए गए और Tenant के UserGroup को सूचित/कुशलतापूर्वक उपयोग करते हैं?

क्या यह पूरी तरह से गलत दिशा में जाने के बारे में मेरे विचार हैं?

+1

आप अपने मॉडल पर पुनर्विचार करके अपनी समस्या को सरल बनाने में सक्षम हो सकते हैं। जब आप क्रॉस बाध्य संदर्भ संचार की आवश्यकता होती है, या जब आप डोमेन पत्राचार के समर्थन में ईमेल पत्राचार जैसे व्यवसाय तर्क का समर्थन करना चाहते हैं, तो डोमेन ईवेंट उपयोगी होते हैं। क्या आपके मॉडल को कई बाध्य संदर्भों की आवश्यकता है? क्या आप सेवा परत में सभी आवश्यक संचालन कर सकते हैं, जैसे उपयोगकर्ता सेवा? – eulerfx

+0

किसी को हमेशा यह जांचना चाहिए कि क्या आप समस्या के आसपास मॉडल नहीं कर सकते हैं। इस मामले में हालांकि यह एक समेकित उदाहरण है जिसका अर्थ यह है कि अलग-अलग बाध्य एआर के बीच संचार कैसे होता है, इस पर जवाब प्राप्त करने के लिए। – Jaapjan

+0

"उपयोगकर्ता समूह में भविष्य के व्यवहार के लिए UserId की आवश्यकता है?" पूछने के लिए एक बहुत ही महत्वपूर्ण सवाल है (अन्यथा आप समेकन के बीच संवाद क्यों करेंगे)।अपने डोमेन का किरायेदार हिस्सा बनाना प्रतीत होता है ... अजीब अगर आपका डोमेन बहु किरायेदारी के बारे में नहीं है (बहु किरायेदारी के साथ भ्रमित नहीं होना चाहिए)। यदि वे एक ही बीसी में हैं तो कुछ टीडीए के साथ मिलकर सहयोग करने के लिए अपने डोमेन ऑब्जेक्ट्स का उपयोग करें। –

उत्तर

6

Saga जो भी आप खोज रहे हैं हो सकता है।

बस शब्दों में कहें: एक सागा को एक ईवेंट हैंडलर के रूप में कार्यान्वित किया जा सकता है जो विशिष्ट घटनाओं और मुद्दों को विभिन्न समग्र जड़ों, या यहां तक ​​कि संदर्भ सीमाओं तक भी जारी करता है।

आपके मामले में यह इस प्रकार दिखाई देंगे:

public class RegisterUserSaga : Handles<UserCreated> 
{ 
    public void Handle<UserCreated>(UserCreated evnt) { 
     var tenantId = // you probably know how to find this 
     var groupId = // same here 
     var command = new RegisterUserForTenant(evnt.UserId, tenantId, groupId); 
     Bus.Send(command); 
    } 
} 

this article में कहानियों के बारे में और अधिक पढ़ें Rinat Abdullin द्वारा या

अद्यतन उदी दहन द्वारा "CQRS, race conditions, and sagas - oh my!" देखने के लिए:

हमारे विस्तारित करने के बाद टिप्पणियों में चर्चा मैं यह दिखाने की कोशिश करूंगा कि यह एक अलग कोण से कैसे काम कर सकता है (आगे छद्म कोड)। यह उम्मीद है कि संभावित समाधान पर कुछ और प्रकाश डालें:

// Aggregates: 

Tenant 
    Guid TenantId 
    List<Guid> UserGroups 

UserGroup 
    Guid UserGroupId 
    List<Guid> Users 

User 
    Guid UserId 
    Some more details 

// Commands: 

RequestRegistration(userId, userGroupId, user details) 
CreateUser(userId, user details) 
AddUserToGroup(userId, userGroupId) 

// The initial command would be: 

RequestRegistration (leading to a RegistrationRequested event) 

// The Saga handles the RegistrationRequested and all subsequent events 

UserRegistrationSaga 
    Handle(RegistrationRequested) 
    -> send CreateUser command (which eventually leads to a UserCreated event) 
    Handle(UserCreated) 
    -> send AddUserToGroup command (-> UserAddedToGroup event) 
    Handle(UserAddedToGroup) 
    -> Done 
+0

यदि संभव हो, तो क्या आपके मन में सही अनुक्रम होने पर आप कुछ प्रकाश डाल सकते हैं? एआर बदलें, ईएस को प्रतिबद्ध करें, प्रसारण कार्यक्रम, सागा उठाता है और अन्य एआर बदलता है और आगे? और इसे जागने, तत्काल और सागा के समय-समय पर कॉल करने के लिए कुछ तंत्र की आवश्यकता होगी, हां? – Jaapjan

+0

यह वही अनुक्रम है जो मुझे दिमाग में था। एक बुनियादी स्टेटलेस सागा कार्यान्वयन किसी अन्य घटना हैंडलर की तरह स्टार्ट-अप पर बस पंजीकृत किया जा सकता है। एक अधिक परिष्कृत कार्यान्वयन में दृढ़ता शामिल हो सकती है। शुरुआत के लिए अवधारणा में उपयोग करने के लिए एक सरल स्टेटलेस कार्यान्वयन पर्याप्त होना चाहिए। अधिक जटिल रूपों के लिए एनएस सर्विसबस में सगाओं और गिटहब में जोनाथन ओलिवर के कॉमन डोमेन/इवेंट स्टोर पर एक नज़र डालें। –

+0

इस विशेष मामले में, चूंकि UserCreated ईवेंट को सागा द्वारा तुरंत नहीं उठाया जा सकता है, इसलिए हम डोमेन में अंतिम सहमति से निपट रहे हैं, हां? चूंकि किसी उपयोगकर्ता को किरायेदार के समूह में 'जोड़ा' हो सकता है लेकिन किरायेदार एआर अभी तक अपडेट नहीं किया गया है? – Jaapjan

संबंधित मुद्दे