2012-04-17 6 views
5

मैं अपने आवेदन में नियंत्रण के कैसल विंडसर के उलटा उपयोग कर रहा हूं। जब एप्लिकेशन पहले लोड होता है, IWindsorContainer.Resolve उदाहरणों में घटकों (विशेष रूप से, कारखानों) को हल करता है।आवेदन में कक्षाओं में नियंत्रण में उलटा होने से हल किए गए उदाहरण कैसे पारित करें?

उदाहरण के लिए, ILoggerFactoryMyCustomLoggerFactory (या जो कुछ भी ILoggerFactory लागू करता है), जिसका विधि CreateLogger() एक लकड़हारा बनाता में हल हो जाता है। मैं प्रत्येक कक्षा को ILoggerFactory.CreateLogger() पर कॉल करना चाहता हूं। हालांकि, मैं प्रत्येक वर्ग के निर्माता में ILoggerFactory पास नहीं करना चाहता हूं।

प्रत्येक कक्षा फैक्ट्री को प्रत्येक बार IWindsorContainer.Resolve पर कॉल किए बिना उपयोग करने के लिए कैसे उपयोग कर सकती है?

उत्तर

3

जहां तक ​​मुझे पता है कि विंडसर कंटेनर से निर्भरता प्राप्त करने के तीन तरीके हैं (आकस्मिक रूप से आपको कभी भी कुछ स्तर स्तर को छोड़कर स्पष्ट रूप से कुछ भी हल करने की आवश्यकता नहीं है, बस सुनिश्चित करें कि यह सब कुछ है कंटेनर में पंजीकृत हो और निर्भरता आप के लिए तार कर रहे हैं):

  1. एक निर्माता तर्क जोड़ें (यह एक आवश्यक निर्भरता माना जाता है)
  2. वर्ग के लिए एक संपत्ति जोड़ें (यह एक वैकल्पिक निर्भरता माना जाता है)
  3. IWindsorContainer इंस्टेंस को पकड़ें और संकल्प को कॉल करें (यह आमतौर पर एक होता है बुरा विचार)

आम तौर पर विशेष रूप से प्रवेश करने के लिए आप बनाना होगा कि एक वैकल्पिक निर्भरता तो विकल्प 2 के लिए जाने के लिए और कुछ इस तरह करते हैं (मैं अपने ILoggerFactory विचार का उपयोग किया है, मैं वास्तव में इस के लिए अपने ही कारखाने को परिभाषित नहीं होगा - देखना बाद में):

private ILoggerFactory _loggerFactory = LoggerFactory.NullLoggerFactory; 

public ILoggerFactory LoggerFactory 
{ 
    get { return _loggerFactory; } 
    set { _loggerFactory = value; } 
} 

इस तरह, अपने कोड में, आप LoggerFactory संपत्ति का उपयोग कर सकते हैं और आप "अशक्त" संस्करण प्राप्त करता है, तो एक कंटेनर को जोड़ा नहीं किया गया है (यह सिर्फ ILoggerFactory का एक उदाहरण है कि बनाता है एक लॉगर जो कुछ भी नहीं करता है) और यदि आपको वास्तविक संस्करण मिल गया है (यदि आप इसका उपयोग करते हैं तो आप केवल शून्य की जांच कर सकते हैं, या यदि आप जानते हैं कि कोई इसका उपयोग करेगा)। आप इस संपत्ति को कक्षाओं पर परिभाषित करते हैं जहां आपको लॉगर की आवश्यकता होती है और आप कर चुके हैं। मुझे लगता है कि के साथ एक छोटे मुद्दा है के बाद से मैं नहीं है वास्तव में मेरे कोड भर में एक विंडसर इंटरफेस चाहते हैं -

एक अलग रूप में

संयोग से, वहाँ है कि आप के बजाय इस्तेमाल कर सकते हैं विंडसर में logging facility के रूप में ऐसी बात है आधार जो मैंने अतीत में किया है, मैंने अपने स्वयं के आईएलओगर इंटरफ़ेस (और इसके एक शून्य कार्यान्वयन) को परिभाषित किया है और उसके बाद एक "महल लॉगर प्रॉक्सी" बनाया है जो मेरे आईएलओगर इंटरफ़ेस को लागू करता है लेकिन महल इलोगर पर निर्भरता है जो इसे कॉल करता है वास्तविक लॉगिंग करने के लिए। इस तरह से मैं इसे अपनी असेंबली में अलग कर सकता हूं और मेरे आवेदन को यह नहीं पता कि विंडसर निर्भरताओं को इंजेक्ट कर रहा है।

शायद आपको परवाह नहीं है, बस सोचा कि मैं इसका उल्लेख करूंगा।

2

आप अपने API polute नहीं करना चाहते हैं, तो आप Ambient Context पैटर्न यहां इस तरह से उपयोग कर सकते हैं:

public abstract class Logger 
{ 
    static Logger() 
    { 
     Current = new DefaultLogger(); 
    } 

    public static Logger Current { get; set; } 

    // your Logger members 
    public abstract void Log(); 
} 

public class DefaultLogger : Logger 
{ 
    public override void Log() 
    { 
     //do something 
    } 
} 
संबंधित मुद्दे