2009-06-02 9 views
5

उदाहरण के लिए, हमारे पास दो डोमेन ऑब्जेक्ट्स हैं: सेल एंड बॉडी (मानव सेल और बॉडी में)।डोमेन संचालित डिज़ाइन में जब कोई इकाई स्वयं क्लोन करता है जो इसे अपने कंटेनर में जोड़ती है?

बॉडी क्लास केवल सेल का संग्रह है, उदा।

class Body 
{ 
    IList<Cell> cells; 
    public void AddCell(Cell c) { ... } 
    public void RemoveCell(Cell c) { ... } 
} 

सेल एक विभाजन विधि है, जो आंतरिक रूप से खुद का क्लोन पैदा करता है, उदाहरण के लिए है

Class Cell 
{ 
    public Cell Split() 
    { 
     Cell newCell = new Cell(); 
     // Copy this cell's properties into the new cell. 
     return Cell; 
    } 
} 

अब, DDD में जब सेल विभाजन चाहिए:

  1. सेल शरीर (जो मतलब यह होगा कि प्रत्येक सेल ऑब्जेक्ट को उसके युक्त शरीर के लिए एक संदर्भ आयोजित) के लिए बनाए गए नए सेल जोड़ सकता हूँ?
  2. या सेवा परत को प्रारंभिक उपयोगकर्ता अनुरोध कॉल स्प्लिट प्राप्त करना चाहिए, लौटाया सेल एकत्र करें और इसे शरीर में जोड़ें? (डोमेन ऑब्जेक्ट्स के बजाए नियंत्रकों का उपयोग करके अधिक एनीमिक डिज़ाइन की तरह लगता है)
  3. या क्या शरीर में स्प्लिटसेल विधि होनी चाहिए?

अग्रिम धन्यवाद।

उत्तर

0

बनाने पढ़ने डोमेन प्रेरित डिजाइन (इवांस) के बाद यह प्रतीत होता है कि इस परिदृश्य सबसे अच्छा है service का उपयोग करके निपटाया गया।

1

डीडीडी में, यह अक्सर डोमेन पर निर्भर करता है। यहां, उदाहरण - और इस प्रकार डोमेन - थोड़ा अजीब लगता है लेकिन मुझे लगता है कि मैं विधि Body पर विधि के लिए जाऊंगा।

हालांकि यह मेरे लिए बहुत स्पष्ट नहीं है कि सेल विभाजन का क्या अर्थ है, और इस क्रिया को क्या ट्रिगर करना चाहिए, मुझे लगता है कि शरीर अपनी कोशिकाओं को विभाजित करने के लिए ज़िम्मेदार है। मैं विधि, या Body पर कुछ ऐसा करने में अधिक आरामदायक होगा, जो प्रत्येक पर Split विधि को कॉल करके आंतरिक कक्षों को विभाजित करता है।

ठीक है, इस उदाहरण निश्चित विचित्र है ...

+0

सेल विभाजन एक मामूली अंतर के साथ सेल की एक सटीक प्रति बनाता है। सिस्टम के भीतर एक और अभिनेता जो केवल कोशिकाओं के बारे में जागरूक है, विभाजन को ट्रिगर करता है। यह अभिनेता वास्तव में शरीर के अस्तित्व के बारे में नहीं जानता है। – ng5000

+1

अजीब उदाहरण मॉडलिंग के वास्तविक डोमेन की तुलना में व्याख्या करना आसान है। मैंने उस समस्या का एक सरल सार उदाहरण के साथ आने की कोशिश की जिसके साथ मैं काम कर रहा हूं। – ng5000

2

मुझे लगता है कि चाहते हैं कि शरीर बस सेल पर splitCell() कॉल करेगा। फिर शरीर नए सेल के साथ जो कुछ भी चाहता है वह कर सकता है - खुद को जोड़ें, इसे उपभोग करें, इसे फेंक दें, जो कुछ भी हो। शरीर में वैसे भी सेल शामिल है।

2

ठीक है - एक और दृष्टिकोण शरीर को "मैं विभाजन कर रहा हूं" या जो कुछ भी कह रहा हूं उसे एक घटना भेजना होगा। और फिर शरीर उस नए सेल को उठा सकता है - शायद उस घटना के पेलोड के रूप में।

यदि आपका बाहरी अभिनेता शरीर के बारे में नहीं जानता है, तो क्या स्प्लिट विधि को एक नया सेल क्लोन वापस करने की आवश्यकता है? क्या बाहरी अभिनेता किसी भी तरह इसका इस्तेमाल करने जा रहा है? या क्या स्प्लिट विधि कुछ भी वापस नहीं कर सकती (शून्य) और बस उस शरीर को एक संदेश भेज सकती है जिसमें वह रहता है?

1

Cell कक्षा पर घटनाओं का उपयोग करना एक प्राकृतिक समाधान की तरह लगता है, लेकिन यह सी # में लागू करने के लिए मुश्किल है।

Cells दायरे में आने पर आपको ईवेंट को हुक करने की आवश्यकता होगी, और जब आप दायरे से बाहर निकलते हैं तो आपको उन्हें अनदेखा करने की भी आवश्यकता होगी - अन्यथा आपको स्मृति लीक मिल जाएगी।

जब भी कोई सेल Body से फिर से जुड़ा होता है, तब भी आपको ईवेंट को हुक करने की आवश्यकता होती है, यानी जब कोशिकाओं को एक स्थिरता स्टोर से पुनर्प्राप्त किया जाता है। रिश्तों को प्रबंधित करने के लिए एक कंटेनर का उपयोग करना (संभवतः एक ओआरएम इंटरसेप्टर) इसे आसान बना सकता है।

आसान विकल्प (, है ना? कोशिकाओं केवल एक ही Body के हैं) माता-पिता Body के लिए एक संदर्भ पकड़, और नए Cell खुद को जोड़ने के लिए यह Body है यह बताने के लिए है।

  • पेशेवर: कोड, डीबग, समझने में आसान।
  • विपक्ष: सेल और शरीर कस युग्मित हो जाते हैं, उन्हें जटिल काम करने के लिए (जो अप्रासंगिक हो सकता है) अन्य संदर्भों में फिर से उपयोग
+0

हाय - धन्यवाद। मैंने इस तरह की घटना प्रबंधन स्थितियों से पहले निपटाया है। बहुत मुश्किल नहीं है लेकिन हमेशा त्रुटि के लिए कमरा। – ng5000

+0

मैं पहले ही फैसला कर चुका हूं कि सेल के पास अनुकूलन के रूप में शरीर (अच्छी तरह से, आईबीडीआई) के लिए एक लिंक होगा। मैंने उस संबंध के बारे में SO में एक प्रश्न पूछा था: http://stackoverflow.com/questions/920158/avoid-circular-reference-in-domain-model – ng5000