सबसे पहले, आपको अपने कुल रूट (यानी ऑर्डर()) के संदर्भ प्राप्त करने के लिए इंटरफेस का खुलासा करना चाहिए। समग्र रूट (यानी ऑर्डर()) के नए उदाहरण को नए अप करने के लिए फैक्टरी पैटर्न का उपयोग करें।
इसके साथ ही, आपके कुल रूट contros के तरीकों से संबंधित वस्तुओं तक पहुंच - स्वयं नहीं। साथ ही, समग्र जड़ों पर सार्वजनिक रूप से जटिल प्रकारों का खुलासा न करें (यानी लाइन्स() उदाहरण सूची में आपने कहा था। यह कमीशन (एसपी सीके) के कानून का उल्लंघन करता है, जो कहता है कि आप आदेशों के लिए अपना रास्ता "डॉट वाक" नहीं कर सकते हैं, जैसे ऑर्डर। लाइन्स। जोड़ें()।
और साथ ही, आप उस नियम का उल्लंघन करते हैं जो क्लाइंट को समग्र रूट पर किसी आंतरिक ऑब्जेक्ट के संदर्भ तक पहुंचने की अनुमति देता है। कुल जड़ें एक आंतरिक वस्तु का संदर्भ वापस कर सकते हैं। जब तक, बाहरी क्लाइंट को उस ऑब्जेक्ट का संदर्भ रखने की अनुमति नहीं है। यानी, आपका "ऑर्डरलाइन" आप RemoveLine() में जाते हैं। आप बाहरी क्लाइंट को अपने मॉडल की आंतरिक स्थिति (यानी ऑर्डर() और इसकी ऑर्डरलाइन()) को नियंत्रित करने की अनुमति नहीं दे सकते। इसलिए, आपको ऑर्डरलाइन को तदनुसार कार्य करने के लिए एक नया उदाहरण होने की उम्मीद करनी चाहिए।
public interface IOrderRepository
{
Order GetOrderByWhatever();
}
internal interface IOrderLineRepository
{
OrderLines GetOrderLines();
void RemoveOrderLine(OrderLine line);
}
public class Order
{
private IOrderRepository orderRepository;
private IOrderLineRepository orderLineRepository;
internal Order()
{
// constructors should be not be exposed in your model.
// Use the Factory method to construct your complex Aggregate
// Roots. And/or use a container factory, like Castle Windsor
orderRepository =
ComponentFactory.GetInstanceOf<IOrderRepository>();
orderLineRepository =
ComponentFactory.GetInstanceOf<IOrderLineRepository>();
}
// you are allowed to expose this Lines property within your domain.
internal IList<OrderLines> Lines { get; set; }
public RemoveOrderLine(OrderLine line)
{
if (this.Lines.Exists(line))
{
orderLineRepository.RemoveOrderLine(line);
}
}
}
आदेश() के नए उदाहरणों बनाने के लिए अपने कारखाने को न भूलें:
public class OrderFactory
{
public Order CreateComponent(Type type)
{
// Create your new Order.Lines() here, if need be.
// Then, create an instance of your Order() type.
}
}
आपका बाहरी ग्राहक को सीधे IOrderLinesRepository का उपयोग करने का अधिकार है, इंटरफ़ेस एक संदर्भ के माध्यम से प्राप्त करने के लिए आपके कुल रूट के भीतर एक मूल्य वस्तु का। लेकिन, मैं अपने रूट को कुल रूट के तरीकों से दूर करने के लिए इसे अवरुद्ध करने का प्रयास करता हूं। तो, आप IOrderLineRepository को आंतरिक के रूप में ऊपर चिह्नित कर सकते हैं ताकि यह खुलासा न हो।
मैं वास्तव में कई सारे कारखानों में अपनी कुल रूट रचनाओं को समूहित करता हूं। मुझे इस दृष्टिकोण को पसंद नहीं आया, "कुछ कुल जड़ें जटिल प्रकारों के लिए कारखानों में होंगी, अन्य नहीं होंगे"। पूरे डोमेन मॉडलिंग के दौरान एक ही तर्क का पालन करना बहुत आसान है। "ओह, तो बिक्री() ऑर्डर() जैसी कुल जड़ है। इसके लिए एक कारखाना भी होना चाहिए।"
एक अंतिम नोट यह है कि यदि संयोजन है, यानी SalesOrder(), जो बिक्री() और ऑर्डर() के दो मॉडल का उपयोग करता है, तो आप SalesOrder() के उस उदाहरण पर बनाने और कार्य करने के लिए एक सेवा का उपयोग करेंगे क्योंकि न तो बिक्री() या आदेश() कुल रूट, न ही उनके भंडार या कारखानों, SalesOrder() इकाई पर अपना नियंत्रण।
मैं अत्यधिक, this free book को डोमेन ड्राइव डिज़ाइन (डीडीडी) पर हाबिल एवरम और फ़्लॉइड मरिनेस्कू द्वारा अत्यधिक अनुशंसा करता हूं क्योंकि यह सीधे आपके प्रश्नों का उत्तर देता है, एक पृष्ठ 100 बड़े प्रिंट में। मॉड्यूल और ऐसे में अपनी डोमेन इकाइयों को और अधिक कम करने के तरीके के साथ-साथ।
संपादित करें: जोड़ा अधिक कोड
मुझे लगता है कि इस विस्तार का अर्थ है कि आप सीधे अपने डोमेन इकाइयों पर ओआरएम का उपयोग नहीं कर रहे हैं। मैं ऊपर वर्णित अतिरिक्त कार्य से बचने में सक्षम होने की उम्मीद कर रहा था, एसक्यूएल को एसक्यूएल स्वचालित रूप से डोमेन ऑब्जेक्ट में किए गए परिवर्तनों को जारी रखकर ... –
y, यह वास्तविक समस्या है। मैं उपरोक्त कर रहा हूं। मैं निबर्ननेट पर अधिक उन्नत परिदृश्यों का समर्थन करने पर हर समय टिप्पणियां देखता हूं, लेकिन मैंने इस प्रकार के परिदृश्य (जो सिर्फ पीओसीओ का उपयोग नहीं कर रहा है) के साथ यह कैसे देखा है, – eglasius
धन्यवाद; यद्यपि बहुत आदर्श नहीं है (एलटीएस की गलती, आपका जवाब नहीं) ऐसा लगता है कि मुझे यह कैसे करना होगा ... – Funka