2011-10-04 12 views
8

खैर, मैं इस शानदार साइट पर अपने घटकों को एप्लिकेशन घटकों में कॉन्फ़िगरेशन सेटिंग्स को इंजेक्ट करने के सही तरीके के बारे में एक प्रश्न के साथ कर रहा हूं। तो, अवलोकन है: मेरे पास सी # नेट 3.5 में लिखा गया एक एप्लीकेशन है। इसमें 3 असेंबली होते हैं - एक कोर, एक डेटा और एक सेवा। डेटा & सेवा असेंबली को app.config से पुनर्प्राप्त सेटिंग्स की आवश्यकता होती है, जो सेटिंग्स फ़ाइल के माध्यम से किया जाता है, उदाहरण के लिए।एप्लिकेशन कॉन्फ़िगरेशन इंजेक्शन करने का सबसे अच्छा तरीका

कोड:

public static String RequestQueueConnectionString 
{ 
    get { return ConnectionSettings.Default.RequestQueueConnectionString; } 
} 

कॉन्फ़िग:

<applicationSettings> 
    <MyNamespace.Data.ConnectionSettings> 
    <setting name="RequestQueueConnectionString" serializeAs="String"> 
    ... 

अब, विधानसभाओं आईओसी के लिए StructureMap का उपयोग कर सभी सेटअप कर रहे हैं - है, जो मेरे मन है कि मैं क्या देख रहा हूँ करने के लिए उत्तर प्रदान करना चाहिए, लेकिन मैं बस इसे देख नहीं सकता!

आईओसी:

public static void ConfigureStructureMap(IContainer container) 
{ 
    container.Configure(x => ... 
    ... 

मुझे क्या करना सक्षम होना चाहते हैं पहले से ही आईओसी कंटेनर ऐसी है कि उन सेटिंग्स, कि विधानसभा के लिए उपयोग किया जाता है नहीं सेटिंग्स फ़ाइल में निर्दिष्ट उन में डाला जा एक विन्यास वर्ग इंजेक्षन करने के लिए है/app.config। तो शायद:

public static void ConfigureStructureMap(IContainer container, MyConfigClass config) 
{ 
    container.Configure(x => x.For<DataConfig>() 
           .Singleton() 
           .Use ??? 
    ... 

मुझे आशा है कि मैं यहाँ पर्याप्त विवरण प्रदान की है - एक नौसिखिया माफ कर अगर मैं नहीं है और मुझे पता है और क्या इस का जवाब देने में मददगार होगा तो कृपया!

+1

आप [इस सवाल] को देख सकते हैं (http://stackoverflow.com/q/7288859/644812)। –

उत्तर

3

तो, बहुत सारी खोज और परीक्षण और त्रुटि के बाद, मुझे @ default.kramer के लिंक के साथ प्रस्तुत किया गया, जिसे मैंने दोहराया! कुछ परीक्षण और त्रुटि के साथ, फिर से (मेरी राय में सबसे अच्छा तरीका), मैं जिस समाधान को ढूंढ रहा था उसे प्राप्त करने में कामयाब रहा। अब, जब आप लिंक का अनुसरण कर सकते हैं (और मैं अत्यधिक ऐसा करने का सुझाव दूंगा), मैं इसे लागू करने के बाद अपने प्रश्न के समाधान को पोस्ट करने जा रहा हूं। उम्मीद है कि यह किसी भी समस्या के साथ किसी की मदद कर सकता है।

public static class DispatchConfiguration 
{ 
    public static void ConfigureStructureMap(IContainer container, IDispatchConfiguration dispatchConfig) 
    { 
     DispatchProcessBatchSize = dispatchConfig.DispatchProcessBatchSize; 
     ServiceIsActive = dispatchConfig.ServiceIsActive; 
     ... 
    } 

अब, इससे पहले कि मैं एक सेटिंग फ़ाइल उपयोग कर रहा था app.config फ़ाइल से बाहर विन्यास को पुनः प्राप्त करने:

तो, मैं अभी की तरह मेरे विन्यास सेटअप वर्ग की है। यह सुनिश्चित करने के लिए स्पष्ट रूप से अच्छा था कि मेरी कॉन्फ़िगरेशन सेटिंग्स को बदलने में लचीलापन था, लेकिन यह मुझे उन सेटिंग्स का आसानी से परीक्षण करने में सक्षम न होने की समस्या के साथ छोड़ दिया। कहें 9/10 परीक्षणों को सेवा सक्रिय होने की आवश्यकता है, लेकिन 1 टेस्ट "ServiceIsActive = false;" का परीक्षण करना चाहता था, अब मैं परेशानी में हूं।

हालांकि अब मैं परीक्षण से विन्यास इंजेक्षन करने में सक्षम हूँ:

[Given(@"Config\.IsServiceActive returns false")] 
public void GivenConfig_IsServiceActiveReturnsFalse() 
{ 
    var settings = new DispatchSettings 
    { 
     ServiceIsActive = false, 
     DispatchProcessBatchSize = 100, 
     UpdatedBy = "Unit Test"  
    }; 

    DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, settings); 
} 

और फिर असली दुनिया में मैं app से सेटिंग प्राप्त करने में सक्षम हूँ।config:

public void Start(String[] args) 
{ 
    var dispatchConfig = this.GetDispatchConfiguration(); 
    DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, dispatchConfig); 
    ... 
} 

private IDispatchConfiguration GetDispatchConfiguration() 
{ 
    var config = (DispatchSettings)ConfigurationManager.GetSection("DispatchSettings"); 
    return config; 
} 

और फिर वास्तविक config वर्ग लगता है:

public interface IDispatchConfiguration 
{ 
    Int32 DispatchProcessBatchSize { get; } 
    Boolean ServiceIsActive { get; } 
    ... 
} 

और अंत में, कॉन्फ़िग फ़ाइल दिखता है: इंटरफ़ेस

[XmlRoot(ElementName = "DispatchSettings", Namespace = "")] 
public sealed class DispatchSettings : IDispatchConfiguration 
{ 
    public Int32 DispatchProcessBatchSize { get; set; } 
    public Boolean ServiceIsActive { get; set; } 
    ... 
} 

पूर्णता के लिए के लिए इतना की तरह दिखता है इस तरह:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="DispatchSettings" type="MyNamespace.XmlConfigurator, MyNamespace.Core" /> 
    </configSections> 

    <DispatchSettings type="MyNamespace.DispatchSettings, MyNamespace.Core"> 
     <ServiceIsActive>True</ServiceIsActive> 
     <DispatchProcessBatchSize>100</DispatchProcessBatchSize> 
    </DispatchSettings> 

अब, उत्सुक आंख वाले किसी भी व्यक्ति को "MyNamespace.XmlConfigurator" दिखाई देगा। मैंने इसे अपनी Google यात्राओं में से एक पर पाया, और कोड आपको अपनी इच्छा के वर्ग में एक एक्सएमएल कॉन्फ़िगरेशन को deserialize करने की अनुमति देता है (जैसा कि इस उदाहरण में दिखाया गया है)। इसलिए, यह सुनिश्चित करने के लिए कि आपके पास इस तकनीक को काम करने के लिए पूरा कोड है, नीचे XmlConfigurator के लिए कोड है। मुझे याद नहीं है कि मैं कहां आया था, लेकिन उस व्यक्ति के लिए बड़ा धन्यवाद जिसने इसे लिखा !!

public sealed class XmlConfigurator : IConfigurationSectionHandler 
{ 
    public XmlConfigurator() 
    { 
    } 

    public object Create(object parent, object configContext, XmlNode section) 
    { 
     XPathNavigator navigator = null; 
     String typeName = null; 
     Type sectionType = null; 
     XmlSerializer xs = null; 
     XmlNodeReader reader = null; 

     try 
     { 
      Object settings = null; 

      if (section == null) 
      { 
       return settings; 
      } 

      navigator = section.CreateNavigator(); 
      typeName = (string)navigator.Evaluate("string(@type)"); 
      sectionType = Type.GetType(typeName); 
      xs = new XmlSerializer(sectionType); 
      reader = new XmlNodeReader(section); 

      settings = xs.Deserialize(reader); 

      return settings; 
     } 
     finally 
     { 
      xs = null; 
     } 
    } 
} 

और वहां आपके पास है! मुझे उम्मीद है कि यह किसी को भी इसे हल करने के लिए एक समान मुद्दे के साथ अनुमति देता है और इसका पालन करने के लिए पर्याप्त स्पष्ट है!

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

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