2010-10-04 8 views
7

मेरे पास एक खिड़की है जो ग्राहक जानकारी दिखाती है। जब खिड़की लोड हो जाती है, तो मैं कन्स्ट्रक्टर से LoadCustomer() विधि को कॉल करता हूं जो डेटाबेस से ग्राहक जानकारी को असीमित रूप से लोड करता है, जो CurrentCustomer संपत्ति सेट करता है। और उसके बाद यूआई अपडेट किया गया है क्योंकि यह CurrentCustomer से जुड़ा हुआ है।एसिंक कॉल अंदर पहुंचने वाला है - क्या यह अच्छा अभ्यास है?

private void LoadCustomer(Guid customerID) 
{   
    var customerContext = new CustomerContext(); 

    var customerQuery = customerContext.GetCustomersQuery() 
             .Where(e => e.CustomerID == customerID); 

    customerContext.Load(customerQuery, 
     loadOperation => 
     { 
     CurrentCustomer = loadOperation.Entities.SingleOrDefault(); 
     }, null); 
} 

वरिष्ठ प्रोग्रामर मुझे बताया गया है कि यह CurrentCustomer के प्राप्त एक्सेसर अंदर इस तर्क डाल करने के लिए बेहतर है, क्योंकि तब

  • डेटाबेस के लिए कॉल आलसी लोड हो रहा है का उपयोग करेगा और
  • रिफैक्टरिंग होगा आसान हो।

क्या संपत्ति के एक्सेसर के अंदर एसिंक डेटाबेस कॉल डालना अच्छा अभ्यास है?

+0

लोड * गेटटर * में नहीं हैं। साइड इफेक्ट्स कोड को पढ़ने की उम्मीद नहीं की जाएगी। यह अधिक संभावना है कि संदर्भ चारों ओर ले जाया जाएगा, इसलिए इसे सभी पठनीय रखने के लिए सबसे अच्छा है। कभी-कभी * सीनियर * का मतलब है * पुराना *। :) –

उत्तर

4

आम तौर पर, यह नहीं है।

आमतौर पर अगर हो रही कुछ हैं और साथ ही कुछ और महंगा कर रही शामिल है, तो आप सिर्फ इस उद्देश्य के लिए एक पूर्ण गेटर विधि का उपयोग करना चाहिए:

public object GetSomething() { } 

// accessing code 
var value = obj.GetSomething(); 

यह हो रही है कि कुछ मुक्त नहीं है कि प्रतीक है ... तुलना के लिए:

var value = obj.Something; 

यह एक सामान्य मूल्य काम खतरनाक async कॉल दृश्य जिसमें, IMO एक बुरा विचार है पीछे चल रहा छुपा की तरह अधिक लग रहा है।

लेकिन बाकी सब कुछ के साथ ... यह पूरे आर्किटेक्चर के अन्य हिस्सों पर पर निर्भर करता है।

यदि ऑब्जेक्ट का पूरा उद्देश्य संपत्ति का उपयोग करके असीमित कॉलों को दूर करना है (जैसे कि लिंक 2 एसक्यूएल या एंटिटी फ्रेमवर्क इकाइयों के मामले में) तो यह ठीक है क्योंकि आपको पता होना चाहिए कि आप कॉल से निपट रहे हैं कोड के संदर्भ से मुक्त (या बंद) नहीं हैं।

...

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

1

वह एक्सेसर में आलसी लोड होने के बारे में सही है - क्योंकि ऑब्जेक्ट निर्माण पर एसिंक कॉल नहीं किया जाएगा। यह केवल तब किया जाएगा जब एक्सेसर को बुलाया जाता है।

वह यह भी संपत्ति एक्सेसर में नहीं छोड़ने की उम्मीद कर रहा है, लेकिन इसे कहीं और refactoring। जब एक्सेसर को पहले से ही अलग किया जाता है तो रिफैक्टर करना आसान होता है।

हालांकि, एक्सेसर में एसिंक कॉल छोड़ना अच्छा नहीं है, लेकिन ऐसा लगता है कि वह वहां रहने की उम्मीद कर रहा है।

5

ऐसा लगता है जैसे आपके वरिष्ठ देव ने एसिंक्रोनस कोड की प्रकृति को याद किया है।किसी संपत्ति के गेटटर को अपना कोड स्थानांतरित करने का एकमात्र तरीका कॉलिंग थ्रेड को अवरुद्ध करना होगा जब तक कि एसिंक्रोनस ऑपरेशन पूरा न हो और वापस लौटने का कोई मूल्य हो। यह बहुत बुरी तरह से व्यवहार संपत्ति होगी।

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