2013-02-21 34 views
5

मैं पुस्तकालय पर काम कर रहा हूं जो एप्लिकेशन कॉन्फ़िगरेशन को सरल बनाता है। अनिवार्य रूप से, लाइब्रेरी के उपभोक्ता या तो गुणों के साथ अपने कॉन्फ़िगरेशन कक्षाओं को सजाने या कोड में घोषणात्मक रूप से सेटिंग्स को प्रारंभ करते हैं। कॉन्फ़िगरेशन गुण (एक्सेसर्स) को पढ़ने/लिखने या कक्षा से डिफ़ॉल्ट प्राप्त करने के लिए 1 या अधिक स्रोत निर्दिष्ट करना संभव होगा। उदाहरण के लिए, निम्नलिखित:लाइब्रेरी में DI के लिए सर्वोत्तम प्रथाएं गुणों में प्रकार

[ConfigurationNamespace(DefaultAccessors = new Type[] { typeof(AppSettingsAccessor) })] 
public class ClientConfiguration : Configuration<IClientConfiguration> 
{ 
    [ConfigurationItem(Accessors = new Type[] { 
     typeof((RegistryAccessor)) 
    })] 
    public bool BypassCertificateVerification { get; set; } 
} 

पढ़ने & विभिन्न स्रोतों (AppSettings, रजिस्ट्री, .ini, आदि, आदि) से लिखित रूप से

var config = new Configuration<IClientConfiguration>(); 
config.SetDefaultAccessors(new[] { typeof(AppSettingsAccessor) }); 
config.SetPropertyAccessors(
    property: x => x.BypassCertificateVerification, 
    accessors: new[] { typeof(RegistryAccessor) } 
); 

पहुंचकर्ता सौदा के बराबर होगा। मैं उपभोक्ताओं को उनकी जरूरतों को पूरा करने के लिए क्षमताओं का विस्तार करने की अनुमति देना चाहता हूं। मैं इसे आईओसी कंटेनर अज्ञेयवादी रखना चाहता हूं। प्रकार [] बाधा मुझे दी गई है क्योंकि मैं संकलन-समय बनाम रनटाइम समस्याओं के कारण विशेषताओं में प्रकार निर्दिष्ट नहीं कर सकता।

वहाँ instantiating के लिए एक डिफ़ॉल्ट तंत्र के लिए एक रास्ता है इन (जैसे, कुछ Activator.CreateInstance के आधार पर), लेकिन यह भी सेवा लोकेटर/निर्भरता समाधानकर्ता पद्धति का उपयोग कर लेने वाली कोड बिना क्रम पर इन accessors का दृष्टांत के लिए अनुमति देते? मैं इस बारे में बहुत कुछ पढ़ रहा हूं कि क्यों सेवा लोकेटर/निर्भरता संकल्प पैटर्न एक बुरा विरोधी पैटर्न है, लेकिन मैं नौकरी के लिए एक बेहतर उपकरण नहीं समझ सकता। मैं निर्भरता संकल्प का उपयोग कर एमवीसी ढांचे और सिग्नलआर पुस्तकालयों को देखता हूं। क्या वे समय के 100% बुरा हैं या यह एक बढ़त मामला है? जहां तक ​​मैं कह सकता हूं, अमूर्त फैक्ट्री पैटर्न इसे काट नहीं देगा क्योंकि इसे टाइप पैरामीटर पसंद नहीं है।

इस विशेष मामले में, विशेषता-आधारित कॉन्फ़िगरेशन घोषणात्मक दृष्टिकोण से अधिक उपयोगी होगा, इसलिए मैं अपने कॉन्फ़िगरेशन विशेषताओं को छोड़ना नहीं चाहता (जो मुझे टाइप करने के लिए आईसीओफ़िगरेशन एक्सेसर को बदलने और फ़ैक्टरी दृष्टिकोण पर स्विच करने की अनुमति देगा)।

उत्तर

5

डीएसएल पर काम से हम जानते हैं कि एपीआई को अंतर्निहित अर्थात् मॉडल अभिव्यक्ति के अन्य तरीकों से अलग करना महत्वपूर्ण है। इस मामले में, Configuration<T> एपीआई मुझे लगता है कि यह अर्थपूर्ण मॉडल होगा। विशेषता-आधारित डीएसएल के बाद सेमेन्टिक मॉडल मॉडल करने का कोई कारण नहीं है। कुछ इस तरह मेरे लिए भी बहुत कुछ मतलब होगा:

var config = new Configuration<IClientConfiguration>(); 
config.DefaultAccessors.Add(new AppSettingsAccessor()); 
config.PropertyAccessorsFor(x => x.BypassCertificateVerification) 
    .Add(new RegistryAccessor()); 

मैं भी विशेषता आधारित मॉडल को बदल देंगे विशुद्ध कथात्मक होने के लिए:

[AppSettingsConfiguration] 
public class ClientConfiguration : Configuration<IClientConfiguration> 
{ 
    [RegistryConfiguration] 
    public bool BypassCertificateVerification { get; set; } 
} 

अब आप 'केवल' एक यह पता लगाने की जरूरत है अनुकूली मॉडल से अर्थपूर्ण मॉडल में अनुवाद करने का तरीका।

यह मूल रूप से किसी अन्य सीरियलाइजेशन पाठक की तरह है: डेटा पढ़ें, और इसे पढ़ने के तरीके पर एनोटेशन के प्रकार से एक संकेत लें। यह मूल रूप से डेटा संरचना पर पुनरावर्ती चलना होगा, और प्रत्येक नोड के लिए आपको एक एक्सेसर बनाना होगा।

यह मानते हुए कि सभी पहुंचकर्ता IAccessor की तरह एक इंटरफ़ेस को लागू, यह एक सार फैक्टरी साथ एक्स्टेंसिबल बनाया जा सकता है:

public interface IAccessorFactory 
{ 
    IAccessor CreateAccessor(ConfigurationAttribute configurationAttribute); 
} 

वास्तव में, यह अधिक विशेष रूप से एक कम व्यापक रूप से जाना जाता है डिज़ाइन पैटर्न उत्पाद व्यापारी कहा जाता हैPLoPD4 में वर्णित है, लेकिन चूंकि अधिकांश लोग इस पैटर्न को नहीं जानते हैं, इसलिए हम इसे सार फैक्टरी - it's not a Service Locator कहते हैं क्योंकि यह एक असंबद्ध प्रकार नहीं लौटाता है - यह केवल IAccessor उदाहरण देता है।

+0

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