2015-10-13 8 views
5

मैं समग्र पैटर्नसी #, महल विंडसर और समग्र डिजाइन पैटर्न

public interface ILogger 
{ 
    void Log(); 
} 

public class A : ILogger 
{ 
    public void Log(...); 
} 

public class B : ILogger 
{ 
    public void Log(...); 
} 

public class Many : ILogger 
{ 
    private readonly List<ILogger> m_loggers; 

    public Many(IEnumerable<ILogger> loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

    public void Log() 
    { 
     m_loggers.ForEach(c => c.Log()); 
    } 
} 

का उपयोग कर कुछ अलग प्लेटफार्मों के लिए एक टेलीमेटरी लकड़हारा तैयार की है अब मैं विंडसर कंटेनर से "कई" का एक उदाहरण प्राप्त करने में सक्षम होना चाहता हूँ लेकिन कुछ समस्याओं का सामना करना पड़ा:

  • अगर सब ILoggers मैं कैसे यकीन है कि मैं "कई" कार्यान्वयन और नहीं 'ए' या 'बी' प्राप्त कर सकते हैं कंटेनर में कर रहे हैं?

  • मैं इस उदाहरण का अनुसरण करने की कोशिश की Castle Windsor: How do I inject all implementations of interface into a ctor? और container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); IEnumerable dependancy के साथ एक वर्ग रजिस्टर करने के लिए, लेकिन अगर कि वर्ग भी IComponent लागू करता है अभ्यस्त यह एक परिपत्र निर्भरता बनाने का उपयोग करें?

क्या मैं भी संभव प्रयास कर रहा हूं?

उत्तर

4

सबसे पहले यह समग्र डिजाइन पैटर्न घटक नहीं है।

जिस तरह से आप अपने मामले में महल विंडसर में यह कर इस

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 
container.Register(Component.For<ILogger>().ImplementedBy<Many>()); 
container.Register(Component.For<ILogger>().ImplementedBy<A>()); 
container.Register(Component.For<ILogger>().ImplementedBy<B>()); 

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

कैसल विंडसर में विभिन्न पैटर्न पंजीकृत करने पर अधिक here पाया जा सकता है।

0

क्या कंटेनर पंजीकरण में फैक्ट्री विधि के साथ यह संभव है?

var container = new Castle.Windsor.WindsorContainer(); 
    container.Register(Component.For<A>()); 
    container.Register(Component.For<B>()); 
    container.Register(Component.For<ILogger>() 
     .UsingFactoryMethod(k => new Many(k.Resolve<A>(), k.Resolve<B>()))); 

    var logger = container.Resolve<ILogger>(); 

बदलने के बाद:

public Many(params ILogger [] loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

विंडसर कंटेनर का सीमित ज्ञान यह करने के लिए मुझे नेतृत्व, वहाँ शायद अपनी वस्तु प्रारंभ करने में एक कारखाने का उपयोग करने का उसी तर्ज पर यह करने के लिए एक सुधार है। महत्वपूर्ण बात यह है कि कॉन्फ़िगरेशन कंटेनर के भीतर है (भले ही यह थोड़ा वर्बोज़ हो)

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