2010-11-17 12 views
6

इस प्रश्न के समान: C# Constructor Design लेकिन यह सवाल थोड़ा अलग है।सी # किसी ऑब्जेक्ट में प्रारंभिक डेटा कहां लोड करना है?

मेरे पास एक क्लास ग्राहक और क्लास ग्राहक प्रबंधक है। जब ग्राहक प्रबंधक वर्ग का एक उदाहरण बनाया जाता है तो मैं सभी ग्राहकों को लोड करना चाहता हूं। और यह वह जगह है जहां मैं फंस गया। मैं इस कई तरीके से कर सकते हैं: निर्माता में

  1. लोड सभी ग्राहकों (मैं इस एक पसंद नहीं है क्योंकि यह है कि अगर मैं कई ग्राहकों है कुछ समय लग सकता है) CustomerManager के हर विधि में
  2. वर्ग कि डेटाबेस से संबंधित कार्य करता है, जाँच ग्राहकों की स्थानीय सूची भरी हुई है और यदि नहीं, सूची लोड:

    public method FindCustomer(int id) 
    { 
        if(_customers == null) 
        // some code which will load the customers list 
    } 
    
  3. एक तरीका है जिसके सभी ग्राहकों को लोड करता है बनाएँ।

    वर्ग में:

    public LoadData() 
    { 
        // some code which will load the customers list 
    } 
    

    रूप में: यह विधि तरीकों जो डेटाबेस से संबंधित कार्य करता है कॉल करने से पहले बुलाया जाना चाहिए

    CustomerManager manager = new CustomerManager(); 
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id); 
    

सबसे अच्छा तरीका क्या करना है इस?

संपादित करें:

मैं लग रहा है कि मैं यहाँ गलत समझा रहा है। शायद ऐसा इसलिए है क्योंकि मैं पर्याप्त स्पष्ट नहीं था। ग्राहक प्रबंधक श्रेणी में मेरे पास कई विधियां हैं जो स्थानीय सूची (_customers) पर निर्भर करती हैं। तो, मेरा सवाल यह है कि, मुझे उस सूची को कहां भरना चाहिए?

+0

जब आपने "फॉर्म" कहा था, तो मेरा मानना ​​है कि यह मायने रखता है कि आपका मतलब वेबफॉर्म या विनफॉर्म था; मैं अलग-अलग लागू करता हूं, क्योंकि कैशिंग भी शामिल है। तो, तुम्हारा मतलब क्या था? – BeemerGuy

+0

मैं Winforms – Martijn

+0

का उपयोग कर रहा हूं, मुझे लगता है कि आपको अधिक विस्तृत करने की आवश्यकता है (आपके EDIT के बाद)। यह स्पष्ट नहीं है कि आलसी लोडिंग आपके 'ग्राहक प्रबंधक' वर्ग के अंदर क्यों काम नहीं करेगी, जब तक आप आलसी 'ग्राहक 'या' आलसी 'में' _customers' को बदल दें और' _customers.Value 'को आंतरिक रूप से देखें। –

उत्तर

9

जो आप वर्णन कर रहे हैं वह "आलसी लोडिंग" है।

private Lixt<Customer> _customers; 
private List<Customer> Customers 
{ 
    get 
    { 
    if(_customers == null) 
     _customers = LoadData(); 
    return _customers; 
    } 
} 

उसके बाद, आप आंतरिक Customers का संदर्भ लें:

एक साधारण दृष्टिकोण इस तरह की एक निजी संपत्ति है। ग्राहकों को पहली बार लोड किया जाएगा, लेकिन पहले नहीं।

यह एक आम पैटर्न है कि नेट 4.0 ने Lazy<T> कक्षा जो आपके लिए यह जोड़ा है।

मुझे लगता है कि मामला है, तो आप सिर्फ यह एक निजी इस तरह के रूप में परिभाषित करते हैं:

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData); 

फिर, आप बस कोड में अपने ग्राहकों का संदर्भ लें:

_customers.Value 

वर्ग के साथ मूल्य प्रारंभ हो जाएगा आपकी LoadData() विधि।

यदि आप अभी तक नेट 4.0 पर नहीं हैं, तो Lazy<T> कक्षा लागू करने के लिए बहुत आसान है।

+1

+1 मुझे 'Lazy ' दिखाने के लिए +1। – Heinzi

+0

मेरा मतलब यह नहीं था, कृपया मेरे संपादन देखें। आलसी दृष्टिकोण – Martijn

+0

के लिए वैसे भी +1 मुझे लगता है कि मैं उलझन में हूं। आप अपने 'ग्राहक प्रबंधक' वर्ग में इस दृष्टिकोण का उपयोग क्यों नहीं कर सकते? –

5

ग्राहकों तक पहुंचने के लिए एक संपत्ति का उपयोग करें। यह जांचें कि क्या ग्राहक लोड हैं या नहीं।

2

अच्छा, यह निर्भर करता है। आपके सभी विकल्पों में फायदे और नुकसान हैं।

विकल्प 1 और 3 के बारे में अच्छी बात यह है कि उपयोगकर्ता पर पूर्ण नियंत्रण रखता है जब (लंबा) डेटा लोडिंग ऑपरेशन किया जाता है। चाहे विकल्प 1 या 3 बेहतर है, इस पर निर्भर करता है कि क्या प्रबंधक बनाने और बाद में डेटा लोड करना समझ में आता है या नहीं। निजी तौर पर, यदि यह एक लंबा ऑपरेशन है, तो मैं एक अलग LoadData विधि पसंद करता हूं, लेकिन यह स्वाद का विषय हो सकता है।

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

सिद्धांत रूप में, आपके द्वारा प्रस्तुत किए गए सभी विकल्प ठीक और वैध विकल्प हैं। यह वास्तव में आपकी आवश्यकताओं पर निर्भर करता है।

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