2011-09-20 16 views
7

क्या निर्भरता की सूची इंजेक्ट करनायूनिटी या अन्य प्रकार के आईओसी पुस्तकालयों में इस तरह की है?यूनिटी .NET: निर्भरताओं की सूची

public class Crawler 
{ 
    public Crawler(IEnumerable<IParser> parsers) 
    { 
     // init here... 
    } 
} 

इस तरह से मैं अपने कंटेनर में एकाधिक आईपर्सर पंजीकृत कर सकता हूं और फिर उन्हें हल कर सकता हूं।

क्या यह संभव है? धन्यवाद

+2

संभावित डुप्लिकेट [एकता के साथ IENumerable को हल करना] (http://stackoverflow.com/questions/1961549/resolving-ienumerablet-with-unity) –

उत्तर

0

ऐसा नहीं है कि मैं कह रहा हूं कि यह गलत है लेकिन ऐसा लगता है कि आप एक प्लगइन मॉडल को हल करने की कोशिश कर रहे हैं जिसे आप आसानी से एमईएफ के उपयोग से प्रबंधित कर सकते हैं। संकेतों को विरासत में इंटरफ़ेस से निर्यात किया जाएगा और फिर जब आप पार्सर्स की आवश्यकता होती है तो आयात करें।

-1

हाँ आप कर सकते हैं .. आप निर्भरता इंजेक्टरों को देख सकते हैं। मैं Autofac प्रोजेक्ट का बड़ा प्रशंसक हूं।

एक अन्य विकल्प Ninject है,

9

यह संभव है, लेकिन आप कुछ समाधान लागू करने के लिए की जरूरत है। सबसे पहले आपको प्रत्येक आईपर्सर को यूनिटी कंटेनर में नाम के साथ पंजीकृत करने की आवश्यकता है। दूसरा आपको कंटेनर में आईपर्सर [] से आईनेमेरेबल < आईपर्सर > से मैपिंग पंजीकृत करने की आवश्यकता है। अन्यथा कंटेनर निर्माता को पार्सर्स इंजेक्ट नहीं कर सकता है। यहां बताया गया है कि मैंने इसे पहले कैसे किया है।

IUnityContainer container = new UnityContainer(); 

container.RegisterType<IParser, SuperParser>("SuperParser"); 
container.RegisterType<IParser, DefaultParser>("DefaultParser"); 
container.RegisterType<IParser, BasicParser>("BasicParser"); 
container.RegisterType<IEnumerable<IParser>, IParser[]>(); 
container.RegisterType<Crawler>(); 

Crawler crawler = container.Resolve<Crawler>(); 

मैं एक कारखाने शुरू करने से इस समाधान को त्याग दिया, कि जरूरत प्रकार के निर्माण के लिए एकता समाहित। यहां बताया गया है कि मैं इसे अपने मामले में कैसे करूंगा।

public interface IParserFactory{ 
    IEnumerable<IParser> BuildParsers(); 
} 

public class UnityParserFactory : IParserFactory { 
    private IUnityContainer _container; 

    public UnityParserFactory(IUnityContainer container){ 
    _container = container; 
    } 

    public IEnumerable<IParser> BuildParsers() { 
    return _container.ResolveAll<IParser>(); 
    } 
} 

public class Crawler { 
    public Crawler(IParserFactory parserFactory) { 
    // init here... 
    } 
} 
इस के साथ

आप इस प्रकार प्रकार रजिस्टर कर सकते हैं:

IUnityContainer container = new UnityContainer(); 

container.RegisterType<IParser, SuperParser>(); 
container.RegisterType<IParser, DefaultParser>(); 
container.RegisterType<IParser, BasicParser>(); 
container.RegisterType<IParserFactory, UnityParserFactory>(); 

Crawler crawler = container.Resolve<Crawler>(); 
0

तथ्य की बात के रूप में, मैं किसी भी कंटेनर करता है नहीं इस समर्थन पता नहीं है।

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

यह सलाह तब नहीं होती है जब उपभोक्ता (आपके मामले में Crawler) एप्लिकेशन के बजाय Composition Root का हिस्सा है। और भी, जब एप्लिकेशन में केवल एक उपभोक्ता होता है जो इस निर्भरता को लेता है, तो यह सौदा बड़ा नहीं हो सकता है।

0

एकता में इसे प्राप्त करने के तरीके हैं।उदाहरण के लिए,

http://sharpsnmplib.codeplex.com/SourceControl/changeset/view/5497af31d15e#snmpd%2fapp.config

<register type="UserRegistry"> 
     <lifetime type="singleton" /> 
     <constructor> 
     <param name="users" dependencyType="User[]" /> 
     </constructor> 
    </register> 

यह निर्माता उपयोगकर्ता ऑब्जेक्ट की श्रृंखला की आवश्यकता है, और जब UserRegistry वस्तु बनाई गई है ऐसे सभी इस कंटेनर में परिभाषित वस्तुओं में एकता द्वारा इंजेक्शन कर रहे हैं।

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