2011-08-19 6 views
5

क्या आप एक वर्ग के भीतर Properties.Settings.Default के उपयोग पर निर्भर करते हैं, और इसलिए इसे इंजेक्ट करते हैं?Properties.Settings.Default के लिए निर्भरता इंजेक्शन का उपयोग करें?

उदा .:

public class Foo 
{ 
    private _settings; 
    private bool _myBool; 

    public Foo(Settings settings) 
    { 
     this._settings = settings; 
     this._myBool = this._settings.MyBool; 
    } 
} 


या आप Settings के उपयोग को व्यापक अभ्यास के रूप में एक अनुप्रयोगव्यापी वैश्विक के रूप में उपयोग करने पर विचार करेंगे?

उदा .:

public class Foo 
{ 
    private bool _myBool; 

    public Foo() 
    { 
     this._myBool = Properties.Settings.Default.MyBool; 
    } 
} 

उत्तर

2

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

मैं इसे ConfigurationManager और WebConfigurationManager के लिए करता हूं ताकि मैं परीक्षणों के लिए सेटिंग्स इंजेक्ट कर सकूं। Nathan Gloyn has wrapped the adapters and interface up already in a project जो आप इसका उपयोग कर सकते हैं यदि आप यह भी करना चाहते हैं।

+0

मुझे एक इंटरफेस का विचार पसंद है, लेकिन मुझे यकीन नहीं है कि इसे लागू करने के बारे में कैसे जाना है। क्या आपके पास एक इंटरफ़ेस है जिसका गुण है जो सेटिंग में सीधे उन लोगों को मैप करता है, या कॉन्फ़िगरेशन मैनेजर का उपयोग करते हैं, वैसे ही जिस कोड से आपने लिंक किया है? पहले कॉन्फ़िगरेशन प्रबंधक का उपयोग नहीं किया गया था, इसलिए यह भी सुनिश्चित नहीं है कि यहां क्या करना है। सही दिशा में एक और झुकाव की सराहना की जाएगी। :) – Andy

+0

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

+0

स्पष्टीकरण के लिए धन्यवाद, यह समझ में आता है। – Andy

2

वे एक निर्भरता के रूप में में पारित किया जाना चाहिए। परिदृश्य की कल्पना करें जब आप अपने उदाहरण # 2 में यूनिट टेस्ट के माध्यम से सेटिंग के उस सेट को बदलना चाहते हैं - आपको उसमें स्थिर संपत्ति गेटटर में किसी प्रकार का जटिल स्विच तर्क होना होगा।

कई आईओसी कंटेनर भी आपकी सहायता के लिए कक्षाओं को इंजेक्ट करते समय सिंगलटन कार्यान्वयन प्रदान कर सकते हैं।

4

मैं "उपरोक्त में से कोई" का चयन और सीधे बूलियन मान डालेगी: किसी भी बुनियादी सुविधाओं बूलियन मान की बहाली का समर्थन करता है कि के ज्ञान से

public class Foo 
{ 
    private readonly bool _myBool; 

    public Foo(bool myBool) 
    { 
     _myBool = myBool; 
    } 
} 

यह अलग करता FooFoo में सेटिंग ऑब्जेक्ट के आधार पर जटिलता को पेश करने का कोई कारण नहीं है, खासकर यदि इसमें अन्य असंबंधित मान शामिल हैं।

+0

+1, लेकिन ध्यान दें कि यह डी कंटेनर के साथ कॉन्फ़िगर करना एक बड़ा कठिन है। फिर भी शायद सबसे अच्छा विचार, हालांकि। – Domenic

+0

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

+0

@ ब्रायन: मैं सहमत हूं, लेकिन मेरे कोड स्निपेट को प्रश्न के प्रयोजनों के लिए अत्यधिक सरल उदाहरण के रूप में विकसित किया गया था। हालांकि, आप जो कहते हैं वह सही है, इसलिए आपके उत्तर के लिए धन्यवाद। – Andy

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