के भीतर बाल वस्तुओं के संशोधन मुझे काफी जटिल परिदृश्य को संभालने का सबसे अच्छा तरीका काम करने में कुछ कठिनाई हो रही है। मैंने कुछ समान प्रश्न देखे हैं, लेकिन किसी ने भी इस परिदृश्य को मेरी संतुष्टि के लिए संबोधित नहीं किया है।डीडीडी - कुल
एकाधिक ऑर्डरलाइन (बाल संस्था) के साथ एक ऑर्डर (कुल रूट) बनाया गया है। व्यापार नियमों के मुताबिक, प्रत्येक ऑर्डरलाइन को ऑर्डर के जीवन के लिए एक ही पहचान बनाए रखना चाहिए। ऑर्डरलाइन में कई (20+) गुण होते हैं और आदेश को "लॉक" माना जाने से पहले काफी बार उत्परिवर्तित किया जा सकता है। इसके अलावा, ऐसे आविष्कार हैं जिन्हें रूट स्तर पर लागू किया जाना चाहिए; उदाहरण के लिए, प्रत्येक ऑर्डर लाइन में मात्रा होती है और ऑर्डर के लिए कुल मात्रा X.
से अधिक नहीं हो सकती है। मुझे यकीन नहीं है कि ऑर्डरलाइन में परिवर्तनों पर विचार करते समय इस परिदृश्य को कैसे मॉडल करें। मैं 4 विकल्प है कि मैं के गर्भ धारण कर सकते हैं, लेकिन कोई भी संतोषजनक प्रतीत:
1) समय, एक ऑर्डर लाइन संशोधित करने के लिए यह रूट द्वारा प्रदान किए गए संदर्भ का उपयोग कर आता है। लेकिन मैं जड़ में invariant तर्क की जांच करने की क्षमता खो देता है।
var orderLine = order.GetOrderLine(id);
orderLine.Quantity = 6;
2) आदेश पर एक विधि को कॉल करें। मैं सभी अपरिवर्तनीय तर्क लागू कर सकते हैं, लेकिन फिर मैं तरीकों का प्रसार ऑर्डर लाइन के कई गुण को संशोधित करने के साथ अटक कर रहा हूँ:
order.UpdateOrderLineQuantity(id, 6);
order.UpdateOrderLineDescription(id, description);
order.UpdateOrderLineProduct(id, product);
...
3) अगर मैं एक मूल्य वस्तु के रूप में ऑर्डर लाइन का इलाज किया यह आसान हो सकता है, लेकिन इसे प्रति व्यावसायिक आवश्यकताओं के समान पहचान बनाए रखना है।
4) मैं उन संशोधनों के लिए ऑर्डरलाइन के संदर्भ ले सकता हूं जो इनवेरिएंट को प्रभावित नहीं करते हैं, और जो लोग करते हैं उनके लिए ऑर्डर के माध्यम से जाते हैं। लेकिन फिर क्या होगा यदि अधिकांश ऑर्डरलाइन गुणों से इनवेरिएंट प्रभावित होते हैं? यह आपत्ति कल्पित है, क्योंकि केवल कुछ गुण इनवेरिएंट को प्रभावित कर सकते हैं, लेकिन जब हम अधिक व्यावसायिक तर्क को उजागर करते हैं तो यह बदल सकता है।
किसी भी सुझाव की सराहना की जाती है ... अगर मैं घना हो रहा हूं तो मुझे बताने में संकोच न करें।
आपके उत्तर के लिए धन्यवाद - मुझे लगता है कि यह संभवतः मेरे द्वारा प्रस्तुत किए गए लोगों का सबसे अच्छा विकल्प है। मैं वास्तव में किसी के लिए एक बेहतर पैटर्न का सुझाव देने की उम्मीद कर रहा था जिसे मैंने अनदेखा कर दिया हो;) मैं इसका उपयोग करने की एक छोटी सी चीज हूं, क्योंकि यह साफ नहीं है। या शायद इसे रखने का एक बेहतर तरीका ... सुसंगत नहीं, जैसा कि @eulerfx ने बताया। लेकिन मुझे लगता है कि यह अब के लिए करेगा ... – Cork
मुझे पता है कि मैंने इसे पहले से ही एक उत्तर के रूप में स्वीकार कर लिया है ... लेकिन मैंने एक अलग दृष्टिकोण के बारे में सोचा। ऑर्डर पर एक सेव (IOrderLine) विधि रखना ठीक होगा? फिर मैं आदेश को रेफरी कर सकता हूं, दानेदार तरीकों का एक गुच्छा से बच सकता हूं, और फिर भी ऑर्डर को इनवेरिएंट को लागू करने की अनुमति देता हूं। – Cork