2012-01-24 13 views
12

के साथ मॉड्यूल/इंस्टॉलर्स/रजिस्ट्रीज़ का अनुकरण कैसे कर सकता हूं ऑटोफैक में मॉड्यूल हैं, विंडसर में इंस्टालर और स्ट्रक्चर मैप रजिस्ट्रीज हैं ... सरल इंजेक्टर के साथ मैं कॉन्फ़िगरेशन लॉजिक को पुन: प्रयोज्य कक्षाओं में कैसे पैक कर सकता हूं?मैं सरल इंजेक्टर

मैं कोशिश की है:

public interface IModule { } 

public class FooModule : IModule 
{ 
    public FooModule(SimpleInjector.Container container) 
    { 
     container.RegisterSingleton<IBar, Bar>(); 
     container.RegisterSingleton<IFoo, Foo>(); 
    } 
} 

और मैं संरचना रूट में इसका इस्तेमाल करते हैं:

public static void Main(string[] args) 
{ 
    var container = new SimpleInjector.Container(); 
    container.RegisterCollection<IModule>(new FooModule(container)); 
    ... 
} 

हालांकि, FooModule कंटेनर पर निर्भर करता है और हो सकता है नहीं एक अच्छा अभ्यास में ... http://code.google.com/p/autofac/wiki/BestPractices देखना :

यदि घटक कंटेनर पर निर्भरता रखते हैं, देखें कि वे सेवाओं को पुनर्प्राप्त करने के लिए कंटेनर का उपयोग कैसे कर रहे हैं, और इसके बजाय उन सेवाओं को घटक (निर्भरता इंजेक्शन) में कन्स्ट्रक्टर तर्कों में जोड़ें।

+0

ध्यान दें कि ऑटोफैक के साथ- आपका 'FooModule' कंटेनर पर निर्भर करेगा (या ऑटोफैक के साथ,' कंटेनरबिल्डर, क्योंकि ऑटोफैक कंटेनर को दो प्रकारों में विभाजित करता है)। [यह ऑटोफैक दस्तावेज] (http://code.google.com/p/autofac/wiki/StructuringWithModules) पर एक नज़र डालें और आप स्पष्ट रूप से देखेंगे कि मॉड्यूल इस निर्भरता को लेते हैं। मॉड्यूल के लिए, आपको बस कंटेनर की आवश्यकता होती है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि मॉड्यूल आपकी रचना रूट का हिस्सा होगा। – Steven

उत्तर

14

एक 'मॉड्यूल' सुविधा जानबूझकर सरल इंजेक्टर कोर लाइब्रेरी से बाहर छोड़ी गई है, लेकिन SimpleInjector.Packaging NuGet package है जो आपको ऐसा करने की अनुमति देता है। 'पैकेज' शब्द सरल इंजेक्टर का उपयोग करता है। हालांकि, यह लाइब्रेरी एक IPackage इंटरफ़ेस और दो एक्सटेंशन विधियों से अधिक कुछ नहीं है। आप इस तरह कोड लिख कर एक ही लक्ष्य को हासिल कर सकते हैं:

एक पैकेज:

public static class BootstrapperPackage 
{ 
    public static void RegisterServices(Container container) 
    { 
     container.Register<IBar, Bar>(Lifestyle.Scoped); 
     container.Register<IFoo, Foo>(Lifestyle.Singleton);    
    } 
} 

अपनी संरचना जड़ में:

public static void Main(string[] args) 
{ 
    var container = new SimpleInjector.Container(); 

    BootstrapperPackage.RegisterServices(container); 

    ... 
} 

SimpleInjector.Packaging NuGet package साथ अंतर यह है कि इस पैकेज के लिए एक इंटरफेस को परिभाषित करता है आप, और आपको एक ही पंक्ति में कई पैकेजों को गतिशील रूप से लोड करने की अनुमति देता है:

public class BusinessLayerPackage : IPackage 
{ 
    public void RegisterServices(Container container) 
    { 
     container.Register<IBar, Bar>(Lifestyle.Scoped); 
     container.Register<IFoo, Foo>(Lifestyle.Singleton);    
    } 
} 

public static void Main(string[] args) 
{ 
    var container = new SimpleInjector.Container(); 

    container.RegisterPackages(AppDomain.CurrentDomain.GetAssemblies()); 
} 

हालांकि, गतिशील लोड हो रहा है की जरूरत है यदि आप वास्तव में नहीं है, स्थिर तरीकों का उपयोग कर (जैसा कि ऊपर दिखाया गया है) पसंद किया जाता है, क्योंकि यह निम्न लाभ हैं:

  • बनाता लोड हो रहा है मॉड्यूल बहुत स्पष्ट है और खोजे।
  • यह चुनना आसान बनाता है कि कौन से मॉड्यूल लोड करना है और कौन सा नहीं।
  • RegisterServices विधियों के लिए अतिरिक्त मानों के साथ पास करना आसान बनाता है, जैसे कॉन्फ़िगरेशन मानों जैसे कि मॉड्यूल की आवश्यकता होती है। यह मॉड्यूल को कॉन्फ़िगरेशन सिस्टम पर हार्ड निर्भरता लेने से रोकता है।

अधिक जानकारी के लिए, कृपया this पढ़ें।

+0

धन्यवाद स्टीवन, ... लेकिन क्या यह अन्य वर्गों में कंटेनर पास करने के लिए सही है? – o3o

+0

नहीं, यह नहीं है, लेकिन एक मॉड्यूल अनुप्रयोग कोड का हिस्सा नहीं है, लेकिन [संरचना रूट] का हिस्सा है (http://blog.ploeh.dk/2011/07/28/CompositionRoot।एएसपीएक्स), जो इसे एक बुनियादी ढांचा घटक बनाता है। अपने बुनियादी ढांचे घटकों के अंदर कंटेनर का उपयोग करना ठीक है। मार्क सेमैन इसका स्पष्ट रूप से वर्णन करता है [यहां] (http://blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx)। – Steven

+1

यह सुविधा कोर लाइब्रेरी से क्यों छोड़ी गई थी? – Sam

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