8

मैं अपने डीआई प्रदर्शन करने वाले कैसल के साथ एक नया .NET समाधान बना रहा हूं।इंस्टॉलर निष्पादन के आदेश को कैसे बल दें

अब यह मंच पर है जहां मैं अपने इंस्टॉलर चलाने के क्रम को नियंत्रित करना चाहता हूं। मैंने व्यक्तिगत कक्षाएं बनाई हैं जो IWindsorInstaller को मेरे मूल प्रकारों को संभालने के लिए कार्यान्वित करती हैं - उदाहरण के लिए आईआरपीपोजिटरी, इंपैपर और आईएस सेवा कुछ नाम।

मुझे लगता है कि मैंने सुझाव दिया है कि मैं इस कक्षा में अपने स्वयं के इंस्टालर फैक्ट्री को लागू करता हूं (अनुमान लगाता हूं कि मैं सिर्फ ओवरराइड चुनता हूं)।

तब करने के लिए अपने कॉल में इस नए कारखाने का उपयोग करें:

FromAssembly.InDirectory(new AssemblyFilter("bin loca­tion")); 

मेरा प्रश्न - जब विधि बचाने अधिभावी - सबसे अच्छा तरीका है मेरे संस्थापक के आदेश के लिए मजबूर करने के लिए है क्या।

+0

आपको जरूरत है मैन्युअल संस्थापक जोड़ें वैसे भी, क्या आप हमें बता सकते हैं कि आपको एक विशिष्ट आदेश को परिभाषित करने की आवश्यकता क्यों है? –

+0

अच्छी तरह से, मान लें कि मैं यह गारंटी देना चाहता हूं कि सेवा इंस्टॉलर सबसे पहले (निर्भरता ग्राफ अनुमति) चलाता है। प्रलेखन का कहना है कि इंस्टॉलर फैक्ट्री को ओवरराइड करना रास्ता है। ऐसा लगता है कि इस विषय पर बहुत कम कवर किया गया है।मुझे लगता है कि यह अंततः IENumerable को फिर से ऑर्डर करने के लिए नीचे आता है जो कि चयन विधि –

उत्तर

21

मैं जानता हूँ कि इसके पहले से ही हल किया है, लेकिन मैं कैसे वास्तव में लागू करने के लिए पर कोई उदाहरण नहीं मिल सकता है इंस्टॉलर फैक्ट्री तो अगर कोई इसके लिए गुगल रहा है तो यहां एक समाधान है।

उपयोग कैसे करें:

[InstallerPriority(0)] 
    public class ImportantInstallerToRunFirst : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store) 
     { 
      // do registrations 
     } 
    } 

बस अपने "स्थापित क्रम के प्रति संवेदनशील" वर्गों के लिए एक प्राथमिकता के साथ InstallerPriority गुण जोड़ें। इंस्टॉलरों को आरोही द्वारा क्रमबद्ध किया जाएगा। प्राथमिकता के बिना इंस्टॉलर 100.

लागू हो जाएगी कैसे लागू करने के लिए:

public class WindsorBootstrap : InstallerFactory 
    { 

     public override IEnumerable<Type> Select(IEnumerable<Type> installerTypes) 
     { 
      var retval = installerTypes.OrderBy(x => this.GetPriority(x)); 
      return retval; 
     } 

     private int GetPriority(Type type) 
     { 
      var attribute = type.GetCustomAttributes(typeof(InstallerPriorityAttribute), false).FirstOrDefault() as InstallerPriorityAttribute; 
      return attribute != null ? attribute.Priority : InstallerPriorityAttribute.DefaultPriority; 
     } 

    } 


[AttributeUsage(AttributeTargets.Class)] 
    public sealed class InstallerPriorityAttribute : Attribute 
    { 
     public const int DefaultPriority = 100; 

     public int Priority { get; private set; } 
     public InstallerPriorityAttribute(int priority) 
     { 
      this.Priority = priority; 
     } 
    } 

जब अनुप्रयोग शुरू करने, Global.asax आदि:

container.Install(FromAssembly.This(new WindsorBootstrap())); 
+1

ग्रेट समाधान, धन्यवाद! –

+1

यह विस्तार बिंदु का प्रकार है जिसे निश्चित रूप से विंडसर में विलय किया जाना चाहिए। अच्छा काम। – M05Pr1mty

+1

दिलचस्प बात यह है कि यदि आप विभिन्न असेंबली से इंस्टॉलर पंजीकृत कर रहे हैं तो यह दृष्टिकोण काम नहीं करता है। इंस्टॉलर फैक्ट्री को एक बार प्रति असेंबली कहा जाता है। – ScottG

0

अंत में मैं के रूप में मेरे विशिष्ट आदेश के साथ IEnumerable<Type> वापस लौट कर पहले से सुझाव दिया InstallerFactory का उपयोग करें और आदेश नियमों को लागू करने के लिए किया था

+0

में पारित किया गया है क्या आपके पास इंस्टॉलरफ़ैक्टरी पर कुछ और जानकारी है? – Chev

+0

@Chev मुझे इसके बारे में बहुत कुछ नहीं मिला, मुझे केवल परिणाम प्राप्त करने के लिए परीक्षण और त्रुटि का उपयोग करना पड़ा। –

3

आप अपने संस्थापक क्रम में कॉल कर सकते हैं वे Global.asax.cs या उदा। में तत्काल होने की आवश्यकता है बूटस्ट्रैपर क्लास में, जिसे Global.asax.cs से कहा जाता है।

 IWindsorContainer container = new WindsorContainer() 
      .Install(     
       new LoggerInstaller()   // No dependencies 
       , new PersistenceInstaller() // --""-- 
       , new RepositoriesInstaller() // Depends on Persistence 
       , new ServicesInstaller()  // Depends on Repositories 
       , new ControllersInstaller() // Depends on Services 
      ); 

वे इस क्रम में instantiated कर रहे हैं, और आप के बाद एक ब्रेकप्वाइंट जोड़ सकते हैं और "Potentially misconfigured components" के लिए कंटेनर देख सकते हैं।

यदि कोई है, तो Status ->details देखें, यदि नहीं, तो यह सही क्रम है।

यह समाधान त्वरित और आसान है, दस्तावेज़ीकरण आपके इंस्टॉलर्स पर कड़े नियंत्रण के लिए एक इंस्टालर फैक्ट्री क्लास का उपयोग करने का उल्लेख करता है, इसलिए यदि आपके पास इंस्टॉलर्स का एक टन है तो दूसरा समाधान बेहतर हो सकता है। (कोड का उपयोग सम्मेलन के रूप में संस्थापक की टन की आवश्यकता नहीं करना चाहिए?)

http://docs.castleproject.org/Windsor.Installers.ashx#codeInstallerFactorycode_class_4

+0

यह वास्तव में काम करेगा, हालांकि इस सवाल के कारण हमारे पास पुस्तकालयों के संदर्भ में अज्ञात इंस्टॉलर थे, और हम गारंटी देना चाहते थे कि वे सभी हमारे सम्मेलन के आधार पर उठाए जाएंगे, लेकिन फिर एक विशिष्ट क्रम में भाग लेंगे - फिर से सम्मेलन के आधार पर। –

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