2013-02-10 7 views
5

मुझे एंटिटीफ्रेमवर्क पीओसीओ के समान डीटीओ कक्षाओं में गहरे क्लोन बनाने के लिए वैल्यू इंजेक्टर का उपयोग करने में कोई समस्या है।आलसी फ्रेमवर्क पीओसीओ को आलसी लोड सूचियों और गुणों को ट्रिगर किए बिना एक डीटीओ को कॉपी करने के लिए वैल्यू इंजेक्टर का उपयोग करें

ऐसे मामलों में जहां मैं कुछ जटिल संस्थाओं/नेविगेशन गुणों के साथ एक जटिल पीओसीओ ऑब्जेक्ट से इंजेक्शन कर रहा हूं, नेविगेशन गुणों के साथ कुछ सरल डीटीओ में, वैल्यू इंजेक्टर अभी भी कई संपत्ति मूल्यों को छू रहा है और डेटाबेस से इस डेटा की आलसी लोडिंग कर रहा है ।

मेरा मानना ​​है कि यह ValueInjecter किसी विशेष स्रोत वस्तु में हर संपत्ति के मूल्य में हो रही के रूप में यह निर्दिष्ट लक्ष्य में मूल्यों इंजेक्षन करने के लिए तैयार है।

मेरे वास्तविक परियोजना काफी जटिल है, लेकिन एक उदाहरण के रूप में, मैं NerdDinner उदाहरण ले लिया है और एक बहुत सरल फैशन में इस मुद्दे को दोहराया है। (NerdDinner EF4 साथ कोड पहले देव का एक उदाहरण (ScottGu NerdDinner Example) है

तो मैं दो मॉडल श्रेणियां होती हैं

public class Dinner 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
    public DateTime EventDate { get; set; } 
    public string Address { get; set; } 
    public string HostedBy { get; set; } 
    public virtual ICollection<RSVP> Rsvps { get; set; } 
} 

और

public class RSVP 
{ 
    public int RsvpID { get; set; } 
    public int DinnerID { get; set; } 
    public string AttendeeEmail { get; set; } 
    public virtual Dinner Dinner { get; set; } 
} 

मैं भी एक डीटीओ वर्ग बनाया।।:

public class DinnerDTO 
{ 
    public int DinnerId { get; set; } 
    public string Title { get; set; } 
    public DateTime EventDate { get; set; } 
    public string Address { get; set; } 
    public string HostedBy { get; set; } 
} 

नोट कि मेरे पास Dinner में DinnerDTO में आरईवीपीएस संग्रह नहीं मिला है।

महत्व के साथ ही, मैं गहरी क्लोनिंग एक वस्तु के लिए CloneInjection सम्मेलन उपयोग कर रहा हूँ। यह कोड एसओ पर, साथ ही साथ कई अन्य साइटों को एक गहरी क्लोन इंजेक्शन करने के दृष्टिकोण के रूप में सुझाया गया है। इस कोड को यहाँ पाया जाता है: CloneInjection Code

अब, आलसी लोड हो रहा है घटित बल देने के लिए, मैं चला गया और ईद के साथ एक रात के खाने के लिए 10,000 RSVP के डाला = 1.

मैं तो निम्न कोड निष्पादित करें:

var dinner = nerdDinners.Dinners.Where(x => x.DinnerId == 1).FirstOrDefault(); 
DinnerDTO dinnerDTO = new DinnerDTO(); 
dinnerDTO.InjectFrom<CloneInjection>(dinner); 

अगर मैं इस पर InjectFrom के साथ लाइन में एक ब्रेकपाइंट, और कदम निर्धारित करते हैं, वहाँ के रूप में यह आलसी लोड 10,000 RSVP के ऊपर एक काफी अंतराल है। यदि मैंने क्लोन इंजेक्शन कोड में Match और SetValue विधियों पर ब्रेकपॉइंट भी सेट किया है, तो लोडिंग अंतराल के हल होने के बाद तक इनमें से कोई भी हिट नहीं होता है। यह मुझे बताता है कि यह ValueInjecter के लिए कुछ आंतरिक होना चाहिए जो RSVPs संपत्ति के आलसी भार को ले रहा है।

अब, अगर मैं यह करने के लिए उपरोक्त कोड संशोधित:

var dinner = nerdDinners.Dinners.Where(x => x.DinnerId == 1).Include("RSVPs").FirstOrDefault(); 
DinnerDTO dinnerDTO = new DinnerDTO(); 
dinnerDTO.InjectFrom<CloneInjection>(dinner); 

यह परिवर्तन RSVP की सूची का एक "उत्सुक लोड" मजबूर करता है, और उम्मीद के रूप में, अंतराल है (एक Include क्वेरी को जोड़ने) क्वेरी के साथ लाइन में, और InjectFrom लाइन किसी भी अंतराल के साथ अतीत में टिक जाती है।

मैं StackOverflow पर कुछ अस्पष्ट संबंधित पोस्ट में पढ़ा है, कुछ को निष्क्रिय करने के लिए और फिर DataContext पर LazyLoading सक्षम करने की सलाह देते हैं। मैंने कोशिश की, और जब यह काम किया, यह बहुत गंदे महसूस किया।

मैंने इस पोस्ट (Copying NHibernate POCO to DTO without triggering lazy load or eager load) और संबंधित कोड के माध्यम से पढ़ा है, उनका दृष्टिकोण कुछ एनएचबीरनेट तरीकों का उपयोग करने के लिए प्रतीत होता है यह निर्धारित करने के लिए कि कोई संपत्ति एक अनियमित प्रॉक्सी है और किसी भी तरह उन्हें बाहर निकाल दें। मैं ईएफ 4 में कुछ भी नहीं ढूंढ पा रहा हूं।

इसका हिस्सा जो वास्तव में मुझे यात्रा करता है, यह है कि आरईवीपीएस संग्रह मेरे डीटीओ ऑब्जेक्ट में भी नहीं है, मुझे इसके मूल्य में भी रूचि नहीं है। यह मेरे लिए सही प्रतीत नहीं होता है। मुझे नहीं लगता कि ValueInjecter कोड को उन गुणों के मूल्यों से पूछताछ करनी चाहिए जिन पर लक्षित वस्तु की परवाह भी नहीं हो सकती है।

क्या ऐसे कुछ साधन हैं जिनसे मैं इस व्यवहार को ValueInjecter में ओवरराइड कर सकता हूं? किसी भी तरह से संपत्ति मूल्यों का मूल्यांकन स्थगित करें जब तक यह बिल्कुल निश्चित न हो कि मैं मूल्य चाहता हूं, जैसे SetValueConventionInjection की विधि? फिर कम से कम यह उन गुणों का मूल्यांकन नहीं करेगा जो मेरा डीटीओ भी नहीं चाहता है।

सबसे अच्छा समाधान जो मैं सोच सकता हूं, वैल्यू इंजेक्टर या कस्टम कन्वेंशन के लिए होगा, किसी भी तरह से एक अनलोडेड आलसी लोड प्रॉपर्टी का पता लगाने में सक्षम होने के लिए, और इसका मूल्यांकन करने के बजाय, यह केवल उस संपत्ति को शून्य पर सेट करेगा निशाना। मुझे नहीं लगता कि यह संभव है हालांकि।

क्या ईएफ के माध्यम से कुछ बेहतर दृष्टिकोण है जिसका उपयोग करना चाहिए? मैं डेटाबेस में सबकुछ लोड करना नहीं चाहता हूं।

क्या मैं पूरी तरह से बंद हूं, और समस्या ValueInjecter में बिल्कुल नहीं है?

* संपादित करें * मैं एक समाधान मिल गया है और इस सवाल का जवाब है, मैं अभी भी उत्सुक हूँ अगर मैं गलत कर रहा हूँ, या अगर कोई एक अभी भी बेहतर तरीका है।

उत्तर

5

मुझे लगता है कि मुझे अपने स्वयं के प्रश्न का संतोषजनक उत्तर मिला है, और इसलिए मैं इसे स्वयं बंद कर रहा हूं। मैं दो चीजें कर रहा था।

सबसे पहले मैंने पूरी तरह से dbContext पर आलसी लोडिंग को अक्षम कर दिया। डीबीकॉन्टेक्स्ट कन्स्ट्रक्टर में इसके समान कुछ।

this.Configuration.LazyLoadingEnabled = false;

मैं तो इसे बंद करने के लिए कोई बड़ा नुकसान था वास्तव में एफई के आलसी लोड सुविधा का उपयोग नहीं किया गया था। इसका मतलब यह है कि यदि मैं संबंधित संस्थाओं को पॉप्युलेट करना चाहता हूं, तो मुझे अपनी क्वेरी पर Include में उन्हें निर्दिष्ट करना होगा। कोई बड़ी बात नहीं।

दूसरी चीज मैंने किया था कोड पर कोड SmartConventionInjection कोड का उपयोग करने के लिए गहरी क्लोन इंजेक्शन सम्मेलन का पुनर्गठन किया गया था। आधार इंजेक्शन की तुलना में एक तेज इंजेक्शन होने के अलावा, यह SetValue कॉल तक संपत्ति मानों को भी स्पर्श नहीं करता है, इसलिए यदि मेरे पास कुछ आलसी लोडिंग गुण भी हैं, तो उन्हें तब तक छुआ नहीं जाएगा जब तक डीटीओ की संपत्ति भी न हो।

+3

मैं अभी आपको चुंबन दे सकता हूं! (एक दोस्ताना गैर-धमकी देने वाला तरीका है) –

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