2012-01-23 19 views
6

मैं वास्तव में सरल और हल्के आईओसी कंटेनर की तलाश में हूं जिसका सी # स्रोत मेरे अपने प्रोजेक्ट (इस प्रकार बाहरी संदर्भ नहीं बना रहा) में शामिल किया जा सकता है।प्रोजेक्ट-एंबेडेड आईओसी कंटेनर

इसका कारण यह है कि मैं एक आधारभूत संरचना लिख ​​रहा हूं और बिना किसी अतिरिक्त निर्भरता के एक एकल। डीएल फ़ाइल प्रदान करना चाहता हूं।

मैं भी आईओसी विधानसभा के साथ अपने विधानसभा ILMerge नहीं करना चाहता ..

मैं MEF के बारे में सोचा, कुछ अन्य सुझाव?

+0

आप अधिक सुझावों के लिए इस .NET को टैग करना चाहेंगे। –

+1

इस प्रश्न को देखें: http://stackoverflow.com/questions/2515124/whats-the-simplest-ioc-container-for-c एक ऑनलाइन उदाहरण है –

+6

यदि आप लाइब्रेरी लिख रहे हैं, तो आपको यह नहीं करना चाहिए एक डी कंटेनर का बिल्कुल उपयोग करें: http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 –

उत्तर

3

यदि आप .NET 4.0 का उपयोग कर रहे हैं तो आपके पास एमईएफ शामिल है।

.NET 2 के लिए मैंने एक बार इंटरफेस और प्रतिबिंब का उपयोग करके कुछ लिखा था। उस प्रक्रिया का वर्णन करने वाले बहुत सारे ट्यूटोरियल हैं। भले ही आप एमईएफ का उपयोग कर सकें, फिर भी कुछ प्रतिबिंब ट्यूटोरियल का प्रयास करने के लायक है, इस प्रकार एमईएफ नीचे काम करता है।

यह भी देखें this प्रश्न जो कुछ अच्छे उत्तरों हैं। TinyIoC इसकी एक एकल स्रोत फ़ाइल की तरह दिखता है।

public class Container 
{ 
    private readonly Dictionary<Type,Func<Container,object>> factories; 
    private readonly Dictionary<Type,object> cache; 

    public Container() 
    { 
     this.factories = new Dictionary<Type,Func<Container,object>>(); 
     this.cache = new Dictionary<Type,object>(); 
    } 

    public void Register<TContract>(Func<Container,TContract> factory) 
    { 
     // wrap in lambda which returns object instead of TContract 
     factories[typeof(TContract)] = c => factory(c); 
    } 

    public TContract Get<TContract>() 
    { 
     var contract = typeof(TContract); 
     if (!cache.ContainsKey(contract)) 
     { 
      this.cache[contract] = this.factories[contract](this); 
     } 
     return (TContract)this.cache[contract]; 
    } 
} 

जो तुम इस तरह का प्रयोग करेंगे::

var container = new Container(); 
container.Register<ICar>(c => new Car(
    c.Get<IEngine>(), c.Get<IWheel>())); 
container.Register<IWheel>(c => new Wheel()); 
container.Register<IEngine>(c => new Engine()); 

var car = container.Get<ICar>(); 

इससे भी अधिक minimalistic निर्भरता क्या करना होगा

+0

TinyIoC के लिए धन्यवाद। ऐसा लगता है कि मैं वास्तव में क्या देख रहा था। – dux2

0

मैं बहुत ज्यादा Castle.Windsor जो खुला स्रोत है, इसलिए आप अपने प्रोजेक्ट

+2

विंडसर हल्के कंटेनर की मेरी परिभाषा नहीं है। इसमें लगभग 4 असेंबली और बहुत सी स्रोत फ़ाइलें/कक्षाएं शामिल हैं। – dux2

0

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

एमईएफ का उपयोग कुछ कंटेनर के रूप में किया जाता है लेकिन (उल्लेखनीय) दूसरों का कहना है कि MEF is not an IOC container, संक्षेप में एमईएफ को एक प्लगइन आर्किटेक्चर के रूप में डिजाइन किया गया था जो एक निर्भरता इंजेक्शन कंटेनर नहीं था।

यह सब ध्यान में रखते हुए, मैं आपको सलाह देता हूं कि आप या तो अपने आवेदन में अपनी पसंद के कंटेनर के लिए पूर्ण स्रोत कोड एम्बेड करें या अपनी असेंबली को अपने आप में विलय करने के लिए टूल का उपयोग करें। ILMerge एक ऐसा उपकरण है जो ऐसा कर सकता है, अधिकतर वाणिज्यिक obfuscators आपको यह करने में भी मदद कर सकते हैं। यदि आप एक वाणिज्यिक पुस्तकालय या आवेदन बना रहे हैं तो मैं निश्चित रूप से एक उचित obfuscator का उपयोग करने की सिफारिश करेंगे।

+0

जैसा कि मैंने अपने प्रश्न में कहा है, मैं अपने स्वयं के प्रोजेक्ट में कंटेनर के स्रोत कोड को एम्बेड करने के लिए तैयार हूं, लेकिन मैं कम से कम फाइलों और कक्षाओं के साथ एक परीक्षण कंटेनर की तलाश में हूं। कृपया कोई ILMerge कृपया। – dux2

+0

कंटेनर के लिए क्या आवश्यकताएं हैं? आपको किस तरह के जीवन चक्र समर्थन की आवश्यकता है? क्या आप एक्सएमएल कॉन्फ़िगरेशन, एक धाराप्रवाह कॉन्फ़िगरेशन एपीआई चाहते हैं या आप प्रत्येक प्रकार को स्पष्ट रूप से कॉन्फ़िगर करने में खुश हैं? –

+0

मैं कंटेनर को कोड द्वारा कॉन्फ़िगर करना चाहता हूं। सिंगलटन और क्षणिक जीवन चक्र के लिए समर्थन चाहते हैं। – dux2

3

आप कुछ भी कल्पना की जरूरत नहीं है, एक डि कंटेनर वास्तव में कम हो सकता है एक कंटेनर के बिना इंजेक्शन:

IWheel wheel = new Wheel(); 
IEngine engine = new Engine(); 
ICar car = new Car(engine, wheel); 

हालांकि, जटिल ऑब्जेक्ट रेखांकन के लिए इसे जल्दी compli प्राप्त कर सकते हैं refactorings के दौरान सही निर्माण आदेश बनाए रखने के लिए cated। कंटेनर में यह समस्या नहीं है।

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