2012-05-25 13 views
12

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

पहला, हमारा लक्ष्य: * कई सजावटकर्ता जो डेटा स्ट्रीम पर काम करते हैं। * सजावट के कई संयोजन संभव हैं और विभिन्न स्थानों से डेटा प्राप्त करने के लिए प्रत्येक मामले में रूट नोड्स की आवश्यकता हो सकती है।

interface IUpdateableValue<T> 
{ 
    T Get(); 
}; 

हम जैसे हैं:

तकनीकी तौर पर, हमारे डिजाइन इस प्रकार है

JsonParser(
    Decompressor(
     Decrypter(decryptionKey 
      FileCache(filename, 
       HttpWebDownloader(url)))) 

XmlParser(
    Decompressor(
     Decrypter(decryptionKey2 
      FileCache(filename2, 
       HttpWebDownloader(url2)))) 

मैं मुसीबत डिजाइन बाहर हो रही कैसल-विंडसर की तरह एक डि-ढांचे में फिट करने के लिए हो रही है: डेटा के तीन सेट घटकों के एक नंबर, सभी को लागू करने IUpdateableValue() (छद्म कोड) के साथ प्राप्त किया करने के लिए । मुझे संदेह है कि इसमें से कुछ नामित उदाहरणों से संभाला जा सकता है, लेकिन यह इस उपयोग के लिए बदबूदार लगता है।

विचार यह है कि उदाहरण के "उपयोगकर्ता" JsonParser और XmlParser उदाहरणों को पता नहीं है (या परवाह है) क्या डेटा HttpUrl से आता है, एक फ़ाइल या जादुई रूप से टोपी से बाहर खींच लिया जाता है।

मुझे लगता है कि हमारे डिजाइन में कुछ गड़बड़ है, लेकिन यह ठीक नहीं है कि इसे कैसे ठीक किया जाए।

प्रगति पर कैसे कोई विचार है?

+0

यहां विंडसर में जेनेरिक सजावटी के साथ काम करने के बारे में प्रश्न हैं (जैसे [यह एक] (http://stackoverflow.com/questions/9888019)), लेकिन मुझे किसी को भी उत्तर देने की याद नहीं है, इसलिए मुझे उम्मीद है कि विंडसर के साथ ऐसा करना मुश्किल होगा। ऑटोफैक या सरल इंजेक्टर जैसे अन्य कंटेनर, अधिक सफलता प्राप्त कर सकते हैं। शायद [सामान्य विकिरणकर्ताओं को पंजीकृत करने के बारे में यह विकी पृष्ठ] (सरल इंजेक्टर में http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) आपको अपने सिस्टम को डिज़ाइन करने के बारे में कुछ विचार दे सकता है। – Steven

+1

आप इसके लिए कैसल का उपयोग क्यों करेंगे? यह क्या लाभ प्रदान करेगा? –

उत्तर

13

कैसल विंडसर के साथ आप सजावटी को सही क्रम में पंजीकृत करके कॉन्फ़िगर कर सकते हैं। आप पहली बार बाहरी decorater रजिस्टर करने की आवश्यकता:

container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<JsonParser>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decompressor>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decrypter>()); 
... 

आप को हल जब IUpdateableValue जाति विंडसर स्वचालित रूप से, उनकी निर्भरता को तार जाएगा ताकि वे सही ढंग से नेस्टेड रहते हैं।

+4

एक साइड नोट के रूप में: 'IsDefault' है जो विंडसर को डिफ़ॉल्ट रूप से किसी विशिष्ट घटक को हल करने का निर्देश देगा। फिर पंजीकरण का आदेश कोई फर्क नहीं पड़ता। – ChrisWue

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