उन लोगों का एक बड़ा समुदाय है जो अपने डोमेन को लागू करने के लिए CQRS का उपयोग करते हैं। मेरी भावना यह है कि, यदि आपके भंडार का इंटरफ़ेस उनके द्वारा उपयोग की जाने वाली सर्वोत्तम प्रथाओं के अनुरूप है, तो आप बहुत दूर नहीं भटकेंगे।
मैंने जो देखा है उसके आधार पर ...
1) कमांड हैंडलर आम तौर पर रिपोजिटरी के माध्यम से कुल लोड करने के लिए रिपॉजिटरी का उपयोग करते हैं। कमांड कुल के एक विशिष्ट उदाहरण को लक्षित करते हैं; भंडार आईडी द्वारा रूट को लोड करता है। ऐसा नहीं है, कि मैं देख सकता हूं, एक ऐसा मामला जहां कमांड्स को एकत्र करने वालों के संग्रह के खिलाफ चलाया जाता है (इसके बजाय, आप पहले एग्रीगेट्स का संग्रह प्राप्त करने के लिए एक क्वेरी चलाएंगे, फिर संग्रह को एन्यूमरेट करेंगे और प्रत्येक को एक कमांड जारी करेंगे।
इसलिए, ऐसे संदर्भों में जहां आप समुच्चय को संशोधित करने जा रहे हैं, मैं रिपॉजिटरी से इकाई (उर्फ मूल जड़) को वापस करने की उम्मीद करूंगा।
2) क्वेरी हैंडलर समुच्चय को बिल्कुल नहीं छूते हैं; इसके बजाय, वे एग्रीगेट्स - वैल्यू ऑब्जेक्ट्स के अनुमानों के साथ काम करते हैं जो किसी समय में एग्रीगेट / एग्रीगेट्स की स्थिति का वर्णन करते हैं। तो एग्रिगेटटीडो के बजाय प्रोग्रेसडॉटो सोचें, और आपके पास सही विचार है।
ऐसे संदर्भों में जहां आप एग्रीगेट के विरूद्ध प्रश्नों को चलाने जा रहे हैं, इसे प्रदर्शन के लिए तैयार कर रहे हैं, और इसी तरह, मैं एक डीटीओ, या डीटीओ संग्रह को देखने की अपेक्षा करूंगा, बजाय एक इकाई के।
आपके सभी getCustomerByProperty
कॉल मेरे लिए प्रश्नों की तरह दिखते हैं, इसलिए वे बाद की श्रेणी में आते हैं। मैं शायद कलेक्शन जनरेट करने के लिए सिंगल एंट्री पॉइंट का इस्तेमाल करना चाहता हूं, इसलिए मैं यह देखना चाहूंगा कि क्या
getCustomersThatSatisfy(Specification spec)
एक उचित विकल्प है; क्वेरी हैंडलर तब दिए गए मापदंडों से उपयुक्त विनिर्देशन का निर्माण करेंगे, और उस विनिर्देश को रिपॉजिटरी को पास करेंगे। नकारात्मक पक्ष यह है कि हस्ताक्षर वास्तव में सुझाव देते हैं कि भंडार स्मृति में एक संग्रह है; यह मेरे लिए स्पष्ट नहीं है कि विधेय आपको बहुत खरीदता है यदि रिपॉजिटरी एक रिलेशनल डेटाबेस के खिलाफ SQL स्टेटमेंट चलाने के लिए केवल एक अमूर्त है।
कुछ पैटर्न हैं जो हालांकि मदद कर सकते हैं। उदाहरण के लिए, हाथ से विनिर्देश के निर्माण के बजाय, रिपॉजिटरी को बाधाओं का वर्णन करने के लिए पास करें, और रिपॉजिटरी के कार्यान्वयन को यह तय करने की अनुमति दें कि क्या करना है।
चेतावनी: जावा टाइपिंग का पता चला
interface CustomerRepository {
interface ConstraintBuilder {
void setLastName();
void setFirstName();
}
interface ConstraintDescriptor {
void copyTo(ConstraintBuilder builder);
}
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor);
}
SQLBackedCustomerRepository implements CustomerRepository {
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor) {
WhereClauseBuilder builder = new WhereClauseBuilder();
descriptor.copyTo(builder);
Query q = createQuery(builder.build());
//...
}
}
CollectionBackedCustomerRepository implements CustomerRepository {
List<CustomerProjection> getCustomersThatSatisfy(ConstraintDescriptor descriptor) {
PredicateBuilder builder = new PredicateBuilder();
descriptor.copyTo(builder);
Predicate p = builder.build();
// ...
}
class MatchLastName implements CustomerRepository.ConstraintDescriptor {
private final lastName;
// ...
void copyTo(CustomerRepository.ConstraintBuilder builder) {
builder.setLastName(this.lastName);
}
}
निष्कर्ष में: एक समग्र प्रदान करने और एक डीटीओ प्रदान करने के बीच का विकल्प इस बात पर निर्भर करता है कि आप उपभोक्ता से क्या उम्मीद कर रहे हैं। मेरा अनुमान प्रत्येक संदर्भ के लिए एक इंटरफ़ेस का समर्थन करने वाला एक ठोस कार्यान्वयन होगा।
GetCustomerByName('John Smith')
यदि आपके डेटाबेस में बीस जॉन स्मिथ हैं तो क्या होगा ? ऐसा लगता है कि आप मान रहे हैं कि दो लोगों का नाम एक जैसा नहीं है।