2010-02-17 24 views
10

मुझे व्यक्तिगत रूप से C# कोड से स्ट्रक्चर मैप को कॉन्फ़िगर करने का विकल्प पसंद है। जो मैं समझता हूं, डीआई के फायदों में से एक यह है कि हम आसानी से एक नए ठोस उदाहरण में स्वैप कर सकते हैं। लेकिन, अगर कॉन्फ़िगरेशन कोड में परिभाषित किया गया है, तो ठोस उदाहरण डीएल में हार्डकोड किए जाते हैं।एक्सएमएल विन्यास या विन्यास?

तो, व्यावहारिक रूप से, यह निर्भरता के रूप में कड़ी मेहनत के रूप में अच्छा है, है ना? मुझे पता है, परीक्षण के दौरान यह जीवन आसान बनाता है ...

मेरा मुद्दा यह है कि, इसके बजाय xml कॉन्फ़िगरेशन का उपयोग करना बेहतर नहीं होगा? आप एक नया ठोस उदाहरण प्लगइन करना चाहते हैं? बस अपने इंस्टॉलर को structmap.config फ़ाइल को नए के साथ ओवरराइट करें।

तो, स्ट्रक्चर मैप को कॉन्फ़िगर करने का पसंदीदा तरीका क्या है?

अतिरिक्त: मुझे समय के लिए सी # कॉन्फ़िगरेशन का उपयोग करने के लिए मजबूर होना पड़ा क्योंकि मुझे नहीं पता कि कनेक्शन स्ट्रिंग को उदाहरण के लिए कैसे पास किया जाए। मैं कॉन्फ़िगरेशन फ़ाइल में कनेक्शनस्ट्रिंग लिख सकता हूं, लेकिन मैं app.config में परिभाषित कनेक्शनस्ट्रिंग का पुन: उपयोग करना चाहता हूं।

उत्तर

17

कोई फर्क नहीं पड़ता कि आप किस विशेष डी कंटेनर का उपयोग करते हैं, आपको हमेशा एप्लिकेशन के ऑब्जेक्ट ग्राफ़ के संकल्प को last responsible moment पर रोकना चाहिए। इसे एप्लिकेशन का Composition Root कहा जाता है।

आप अपने आवेदन का बड़ा हिस्सा without ever referencing the DI Container लिख सकते हैं। इसका यह भी अर्थ है कि आप कोड या कॉन्फ़िगरेशन में कॉन्फ़िगरेशन के बीच निर्णय को तब तक रोक सकते हैं जब तक आपको इसकी आवश्यकता न हो।

आप shouldn't need the container at all for unit testing, लेकिन इसे एकीकरण परीक्षण के लिए आवश्यकता हो सकती है। हालांकि, एकीकरण परीक्षणों में, आपको अंतिम आवेदन की तुलना में कंटेनर के लिए एक अलग कॉन्फ़िगरेशन की आवश्यकता होगी।

सब कुछ, कोड में कंटेनर को कॉन्फ़िगर करना इन दिनों पसंदीदा दृष्टिकोण है क्योंकि यह अधिक मजबूत है और आप सम्मेलन-आधारित कॉन्फ़िगरेशन यांत्रिकी लागू कर सकते हैं।

एक्सएमएल कॉन्फ़िगरेशन अधिक भंगुर और बहुत वर्बोज़ होता है। ज्यादातर मामलों में, यह आपको बस धीमा कर देता है क्योंकि आपको कोई रिफैक्टरिंग या कंपाइलर समर्थन नहीं मिलता है।

हालांकि, XML कॉन्फ़िगरेशन अभी भी मान्य है जब आपको एप्लिकेशन को पुन: संकलित किए बिना निर्भरताओं को स्वैप करने में सक्षम होना चाहिए। अधिकांश डी कंटेनर आपको उन दृष्टिकोणों को मिश्रित करने देंगे ताकि आप कोड में अपनी अधिकांश कॉन्फ़िगरेशन प्राप्त कर सकें, लेकिन एक्स्टेंसिबिलिटी कारणों के लिए XML में परिभाषित कुछ चयनित निर्भरताएं।

+0

हम्म ... कि उचित लगता है:

 [Test] public void setup_concrete_class_via_application_configuration() { var container = new Container(config => { config.ForConcreteType<DatabaseSettings>().Configure .Ctor<string>("type").EqualToAppSetting("dovetail.database.type", "mssql") .Ctor<string>("connectionString").EqualToAppSetting("dovetail.database.connectionString"); }); var databaseSettings = container.GetInstance<DatabaseSettings>(); databaseSettings.Type.ShouldEqual("mssql"); databaseSettings.ConnectionString.ShouldEqual("Data Source=.; Initial Catalog=dovetail;User Id=sa;Password=sa;"); } 

अंत में यहाँ क्या आवेदन सेटिंग्स अपने आवेदन config में की तरह लग रही है। धन्यवाद!! –

+0

जबकि मैं आपके उत्तर से सहमत हूं। ऐसा लगता है कि सवाल वास्तव में पूछा गया कि मैं अपने आवेदन विन्यास को अपने प्रकार में कैसे प्राप्त करूं। – KevM

+0

@ केवीएम, वास्तव में नहीं। मेरा प्रश्न अधिक था कि कॉन्फ़िगरेशन विकल्प बेहतर है। यह उठ गया, क्योंकि मुझे xml का उपयोग करके अपने कनेक्शन में मेरी कनेक्शन स्ट्रिंग प्राप्त करने में कठिनाई हो रही थी। मुझे structmap.config फ़ाइल में एक बार कनेक्शन स्ट्रिंग लिखी होगी। मैं दो स्थानों पर कनेक्शनस्ट्रिंग को बनाए रखने से बचना चाहता था। –

6

अपने प्रश्न का उत्तर देने के लिए आप अपना केक ले सकते हैं और इसे स्ट्रक्चर मैप में भी खा सकते हैं। आप कोड से अपने कंटेनर को कॉन्फ़िगर कर सकते हैं और उस कॉन्फ़िगरेशन से आवश्यक कॉन्फ़िगरेशन के उस अतिरिक्त बिट में धक्का दे सकते हैं। यही है EqualToAppSetting के लिए है।

एक सेटिंग वर्ग

public class DatabaseSettings 
{ 
    public DatabaseSettings(string type, string connectionString) 
    { 
     Type = type; 
     ConnectionString = connectionString; 
    } 

    public string Type { get; set; } 
    public string ConnectionString { get; set; } 
} 

अगला StructureMap बताओ अपने आवेदन सेटिंग्स का उपयोग कर यह कॉन्फ़िगर करने के लिए बनाएँ।

<appSettings> 
    <add key="dovetail.database.type" value="mssql"/> 
    <add key="dovetail.database.connectionString" value="Data Source=.;Initial Catalog=dovetail;User Id=sa;Password=sa;"/>  
</appSettings> 
+0

मैंने इसके बारे में सोचा था, लेकिन मेरे लिए नकारात्मकता यह थी कि मुझे करना होगा दो स्थानों पर कनेक्शनस्ट्रिंग को ट्रैक करें। वेब/app.config के कनेक्शनस्ट्रिंग सेक्शन में एक बार और एक बार ... उत्तर के लिए धन्यवाद :) –

+0

मेरे कनेक्शन स्ट्रिंग समस्या को हल करने के लिए इस समय आपके सुझाव का उपयोग कर रहा हूं। एप्लिकेशन स्टार्ट पर मैं web.config को कनेक्शनस्टिंग नामक एक नई ऐप सेटिंग शामिल करने के लिए संपादित करता हूं। यह कनेक्शन से मूल्य प्राप्त करता है स्ट्रिंग उचित कनेक्शन में परिभाषित स्ट्रिंग अनुभाग। इस प्रकार मुझे केवल एक ही स्थान पर कनेक्शन स्ट्रिंग को संशोधित करना होगा। और मेरी structmap कॉन्फ़िगरेशन इसे ऐप्स सेटिंग्स से पढ़ सकता है ... धन्यवाद! –

+0

मदद करने के लिए खुश। हमने किसी भी कंटेनर कॉन्फ़िगरेशन से बचने के लिए पारंपरिक रूप से सेटिंग ऑब्जेक्ट्स में कॉन्फ़िगरेशन को खींचने का एक तरीका बेक किया। मुझे वास्तव में इसके बारे में ब्लॉग करना चाहिए। – KevM

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