2010-06-13 12 views
6

मेरे पास ऑब्जेक्ट्स का गहरा पदानुक्रम है कि मैं एंटिटी फ्रेमवर्क 4, पीओसीओ, पीआई (पर्सिस्टेंस अज्ञानता) और कोड फर्स्ट के साथ बने रहने की कोशिश कर रहा हूं। जब अचानक नए() ऑपरेटर का उपयोग न करने के लिए मेरे सामने आ गया तो अचानक चीजें बहुत अच्छी तरह से काम करना शुरू कर दीं। मूल रूप से लिखा गया है, ऑब्जेक्ट्स अक्सर बच्चे वस्तुओं को बनाने के लिए नए() का उपयोग करते हैं।इकाई फ्रेमवर्क 4 कोड प्रथम और नया() ऑपरेटर

इसके बजाय मैं आवश्यकतानुसार सभी बाल वस्तुओं को बनाने के लिए रिपोजिटरी पैटर्न पर अपना उपयोग कर रहा हूं। उदाहरण के लिए, दिए गए:

class Adam 
{ 
    List<Child> children; 
    void AddChildGivenInput(string input) { children.Add(new Child(...)); } 
} 

class Child 
{ 
    List<GrandChild> grandchildren; 
    void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); } 
} 

class GrandChild 
{ 
} 

("GivenInput" यहाँ नहीं दिखाया कुछ प्रसंस्करण का तात्पर्य है) मैं एक AdamRepository तरह परिभाषित करते हैं:

class AdamRepository 
{ 
    Adam Add() 
    { 
     return objectContext.Create<Adam>(); 
    } 
    Child AddChildGivenInput(Adam adam, string input) 
    { 
     return adam.children.Add(new Child(...)); 
    } 
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
     return child.grandchildren.Add(new GrandChild(...)); 
    } 
} 

अब, यह काफी अच्छी तरह से काम करता है। हालांकि, मैं अपने दृढ़ता तंत्र के "अज्ञानी" नहीं हूं क्योंकि मैंने नए() ऑपरेटर को त्याग दिया है।

इसके अतिरिक्त, मुझे anemic domain model का जोखिम है क्योंकि डोमेन ऑब्जेक्ट्स की बजाय रिपॉजिटरी में इतना तर्क समाप्त होता है।

बहुत adieu के बाद, एक सवाल:

या बल्कि कई सवाल ...

  • इस पैटर्न के साथ एफई 4 संहिता सबसे पहले काम करने के लिए आवश्यक है?
  • क्या नया() का उपयोग बनाए रखने का कोई तरीका है और अभी भी ईएफ 4/पीओसीओ/कोड पहले के साथ काम करता है?
  • क्या कोई अन्य पैटर्न है जो डोमेन ऑब्जेक्ट में तर्क छोड़ देगा और अभी भी ईएफ 4/पीओसीओ/कोड पहले के साथ काम करेगा?
  • क्या यह प्रतिबंध कोड प्रथम समर्थन के बाद के संस्करणों में उठाया जाएगा?

कभी कभी जाना Niagra Falls अप तैराकी की तरह POCO/ हठ अज्ञान मार्ग, दूसरी बार ऐसा लगता है तैराकी नदी के ऊपर की तरह लगता है की कोशिश कर रहा।

अपनी कक्षाओं में आप बच्चों संग्रह और एक विधि के लिए एक क्षेत्र के बच्चों के लिए जोड़ने के लिए: फिर भी, मेरा मानना ​​है कि करना चाहते हैं ...

उत्तर

4

यहाँ अंक की एक जोड़ी है कि आपके सवाल का जवाब सहायक हो सकते हैं । सामान्य रूप से ईएफ (केवल कोड पहले नहीं) वर्तमान में यह आवश्यक है कि संग्रह सतह के रूप में सतह हों, इसलिए यह पैटर्न वर्तमान में समर्थित नहीं है। कक्षाओं के साथ हम कैसे बातचीत करते हैं, इस बारे में अधिक लचीलापन ईएफ के लिए एक आम पूछताछ है और हमारी टीम इस बात पर ध्यान दे रही है कि हम इस समय

पर इसका समर्थन कर सकते हैं आपने उल्लेख किया है कि आपको संदर्भ के साथ संस्थाओं को स्पष्ट रूप से पंजीकृत करने की आवश्यकता है, यह आवश्यक नहीं है मुकदमा। निम्न उदाहरण में यदि GetAdam() ने एडम ऑब्जेक्ट को वापस कर दिया है जो अंतर्निहित संदर्भ से जुड़ा हुआ है तो डेटाबेस में सहेजने और डालने पर नया बच्चा कैन स्वचालित रूप से ईएफ द्वारा खोजा जाएगा।

var adam = myAdamRepository.GetAdam();

var cain = new child();

adam.Children।(कैन) जोड़ें;

~ रोवन

+0

स्टैक ओवरफ़्लो में आपका स्वागत है। मौलिक समस्या यह है कि मेरे पास वास्तव में एक गहरी वस्तु पदानुक्रम है, जहां प्रत्येक स्तर जानता है कि अगले स्तर की वस्तुओं के उदाहरण कैसे बनाएं। मेरी समझ और अनुभव यह है कि मुझे अपने ऑब्जेक्ट पदानुक्रम को ऑब्जेक्ट कॉन्टेक्स्ट में व्यक्तिगत रूप से सभी ऑब्जेक्ट्स को संलग्न करने से पहले मैन्युअल रूप से चलाना होगा। मेरा आवेदन काफी जटिल है लेकिन मैं इसे एक सरल, पूर्ण उदाहरण पर कोशिश कर दूंगा। हालांकि कल नहीं होगा, आशा है कि कल। –

+1

@ एरिक जे, जो रोवन के जवाब से मुझे समझ में नहीं आया। मेरे लिए ऐसा लगता है जैसे "यदि आप संबंधित वस्तुओं के सार्वजनिक संग्रह में कुछ जोड़ते हैं, तो ईएफ स्वचालित रूप से उस इकाई को संग्रहीत करेगा भले ही आपने इसे ऑब्जेक्ट कॉन्टेक्स्ट में स्पष्ट रूप से नहीं जोड़ा है"। यह LINQ से SQL के व्यवहार के अनुरूप है। –

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