8

मैं 4 परियोजनाएं हैंनिर्भरता इंजेक्शन और परियोजना संरचना

  • कोर
  • StructureMap

इन्फ्रास्ट्रक्चर (सेवा):

  • कोर
  • बाहरी निर्भरता

कंसोल:

  • कोर
  • DependencyResolver

Requierements:

मैं केवल DependencyResolver में StructureMap उपयोग करने के लिए कोशिश कर रहा हूँ। इसके अलावा कंसोल एप्लिकेशन को इन्फ्रास्ट्रक्चर के बारे में कुछ भी नहीं पता होना चाहिए।

जब मैं अपने कंसोल एप्लिकेशन पर स्ट्रक्चर मैप का संदर्भ नहीं देना चाहता हूं तो मुझे एक सेवा लोकेटर बनाना होगा।

DependencyResolver में मैं एक Bootstrapper कि StructureMap रजिस्ट्री सामान (रजिस्टर)

बुला मेरी कंसोल आवेदन में के लिए जिम्मेदार है मैं एक उदाहरण प्राप्त करना चाहते है। इसके लिए मुझे स्ट्रक्चर मैप का संदर्भ देना होगा। एक और तरीका संरचना मैप्स समाधान विधियों के चारों ओर एक छोटे से रैपर लिखना होगा।

क्या स्ट्रक्चर मैप से कंसोल को डीकॉप्लिंग करने का कोई और बेहतर तरीका है?

+0

थोड़ा अधिक इंजीनियर लगता है। आपका कोड कैसा दिखता है? यदि आपकी निर्भरता रिज़ॉल्यूशन पहले से ही संरचना मानचित्र को समाहित कर देता है तो आपको सेवा लोकेटर की आवश्यकता क्यों है? – SimonC

+0

क्या आपने देखा है http://bootstrapper.codeplex.com/ –

+0

नाम निर्भरता रिज़ॉल्वर इस बात का सम्मान करने के लिए सबसे अच्छा विकल्प नहीं है कि घटक किस के लिए उत्तरदायी है। फिलहाल इसकी एकमात्र जिम्मेदारी निर्भरताओं को पंजीकृत करना है। तो मेरा प्रश्न निर्भरता इंजेक्शन के हल करने वाले हिस्से के बारे में अधिक है। – Rookian

उत्तर

17

जबकि मुझे आईओसी रजिस्टर को अलग करने का एक कारण दिखाई देता है, संकल्प, एप्लिकेशन के कार्यान्वयन से मुक्त हो जाता है, मुझे कोई कारण नहीं दिखता कि आईओसी कंटेनर कंसोल एप्लिकेशन (संरचना रूट) में क्यों नहीं होना चाहिए और इसके बजाय एक और असेंबली में आवेदन कार्यान्वयन।

इस तरह सांत्वना आवेदन बहुत आसान है:

  1. कंटेनर
  2. लोड कंटेनर विन्यास
  3. आवेदन आवेदन पर
  4. कॉल रन बनाएं का समाधान करें और
  5. साथ सांत्वना तर्क पारित
  6. कंटेनर का निपटान करें जब एप्लिकेशन रन विधि
से बाहर निकलता है एसएम साथ

इसे इस तरह के बारे में देखो:

public void Main(params string[] args) 
{ 
    using (var container = new Container()) 
    { 
     container.LoadAllConfigurationModules(); 
     container.AddRegistry<SomeRegistry>(); 
     container.GetInstance<Application>().Run(args); 
    } 
} 

चीजें आप स्टार्टअप पर नहीं बना सकते के लिए आप अपने आवेदन विधानसभा में एक कारखाने इंटरफ़ेस बनाने:

interface ISomeFactory { ISomeDependency CreateSomeDependency() } 

और में इस इंटरफ़ेस को लागू कंटेनर इंजेक्शन करके कंसोल एप्लिकेशन और उदाहरण को हल करने के लिए इसका इस्तेमाल करें। मुझे लगता है कि एस एम कार्यान्वयन इस तरह दिखता है:

public class SomeFactory : ISomeFactory 
{ 
    public SomeFactory(IContainer sontainer) { this.container = container; } 
    ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); } 
} 

अन्य आईओसी कंटेनर यहां तक ​​कि इन इंटरफेस कारखानों स्वचालित रूप से लागू करने के लिए functionallity है।

+0

आपके समाधान के साथ आपको कंसोल एप्लिकेशन में सभी पुस्तकालयों का संदर्भ देना होगा। क्योंकि संरचना जड़ सीधे मुख्य वर्ग में स्थित है। – Rookian

+6

हां यह सही है। लेकिन समस्या कहां है? इस असेंबली में बिल्कुल एक उद्देश्य है - बूटस्ट्रैपिंग! –

+0

आह ठीक है। आपका दूसरा कथन महत्वपूर्ण है। यह समझ आता है। – Rookian

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