2009-09-19 17 views
5

मैं एक खोज अनुप्रयोग बना रहा हूं जिसने कई अलग-अलग डेटा स्रोतों को अनुक्रमित किया है। जब खोज इंजन इंडेक्स के खिलाफ एक क्वेरी की जाती है, तो प्रत्येक खोज परिणाम निर्दिष्ट करता है कि यह किस डेटा स्रोत से आया था। मैंने एक फैक्ट्री पैटर्न बनाया है जिसे मैं प्रत्येक प्रकार के खोज परिणाम के लिए एक अलग टेम्पलेट प्रदर्शित करता था, लेकिन मुझे एहसास हुआ है कि यह पैटर्न प्रबंधित करना अधिक कठिन हो जाएगा क्योंकि खोज इंजन द्वारा अधिक से अधिक डेटा स्रोतों को अनुक्रमित किया जाता है (यानी नया प्रत्येक नए डेटा स्रोत के लिए कोड टेम्पलेट बनाया जाना चाहिए)।सी # फैक्टरी पैटर्न

मैं DotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

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

क्या किसी के पास इस तरह के पैटर्न के कोई उदाहरण हैं? कृपया मुझे बताओ। धन्यवाद, -Robert

उत्तर

4

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

उदाहरण के लिए, (अगर मैं इस को सही ढंग से समझ रहा हूँ) आप विशेषताओं के साथ इन डेटा स्रोतों है लगता है:

Document { Author, DateModified } 
Picture { Size, Caption, Image } 
Song { Artist, Length, AlbumCover } 

तब आप अपने खोज परिणामों में इन डेटा स्रोतों में से प्रत्येक से एक हो सकता है। प्रत्येक तत्व को अलग-अलग प्रस्तुत किया जाता है (चित्र को बाईं ओर एंकर किए गए पूर्वावलोकन छवि के साथ प्रस्तुत किया जा सकता है, या गीत एल्बम कवर, आदि प्रदर्शित कर सकता है)

चलो बस अपने प्रस्तावित डिज़ाइन के तहत प्रतिपादन को देखें। आप रेंडरिंग के लिए डेटाबेस से पूछने जा रहे हैं और उसके बाद कुछ HTML को उत्सर्जित कर रहे हैं, क्योंकि आप दस्तावेज़ों के लिए हरे रंग की पृष्ठभूमि चाहते हैं और चित्रों के लिए नीली एक चाहते हैं। तर्क के लिए, मान लें कि आपको एहसास है कि आपको वास्तव में गाने के लिए तीन पृष्ठभूमि रंग, चित्रों के लिए दो और दस्तावेज़ों के लिए एक की आवश्यकता है। अब, आप डेटाबेस स्कीमा परिवर्तन को देख रहे हैं, जिसे प्रोमोटेड मान लागू करने वाले पैरामीटरयुक्त टेम्पलेट को बदलने के अलावा, प्रचारित और धक्का दिया जाता है।

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

इस तरह डिज़ाइन टूट जाता है, क्योंकि अब आप लचीलापन खो चुके हैं डेटा स्रोत प्रति अलग टेम्पलेट परिभाषित करें। दूसरी चीज जो आप खो देते हैं वह आपके टेम्पलेट को स्रोत नियंत्रण में संस्करणित कर रही है।

मैं देखता हूं कि आप अपने उत्सर्जित विचारों में सामान्य तत्वों/नियंत्रणों का पुन: उपयोग कैसे कर सकते हैं, लेकिन टेम्पलेट और डेटा स्रोत के बीच फैक्ट्री में मैपिंग रखें, और टेम्पलेट को डेटा स्रोत प्रति अलग फ़ाइलों के रूप में रखें।सीएसएस या इसी तरह की विन्यास सेटिंग्स के माध्यम से प्रतिपादन को बनाए रखने के लिए देखो। सरल XML फ़ाइल के रूप में मैपिंग को निर्यात करने पर विचार करना, इसे बनाए रखना आसान बनाना है। एक नया डेटा स्रोत तैनात करने के लिए, आप बस एक मैपिंग जोड़ते हैं, उचित टेम्पलेट और सीएसएस फ़ाइल बनाते हैं, और उन्हें अपेक्षित स्थानों पर छोड़ देते हैं।

नीचे टिप्पणी करने के लिए उत्तर:

मैं मतलब एक सरल स्विच बयान पर्याप्त होना चाहिए:

switch (resultType) 
{ 
    case (ResultType.Song): 
     factory = new SongResultFactory(); 
     template = factory.BuildResult(); 
     break; 
    // ... 

आप कहाँ उत्पादन के लिए तर्क दिए गए टेम्पलेट है। तब

IDictionary<ResultType, ResultFactory> TemplateMap; 
mapping = new Dictionary<ResultType, ResultFactory>(); 
mapping.Add(ResultType.Song, new SongResultFactory()); 
// ... for all mappings. 

, एक स्विच बयान के बजाय, आप इस एक लाइनर कर सकते हैं:: आप एक लंबे स्विच बयान की तुलना में अधिक कॉम्पैक्ट कुछ चाहते हैं, तो आप मैपिंग एक शब्दकोश में, इस तरह बना सकते हैं

template = TemplateMap[resultType].CreateTemplate(); 

मेरा मुख्य तर्क यह था कि किसी बिंदु पर आपको अभी भी मैपिंग को बनाए रखना होगा - या तो डेटाबेस में, एक बड़ा स्विच स्टेटमेंट, या यह IDictionary उदाहरण जिसे प्रारंभ करने की आवश्यकता है।

आप इसे आगे ले और एक सरल एक्सएमएल फ़ाइल में मैपिंग कि में पढ़ा है स्टोर कर सकते हैं:

<TemplateMap> 
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" /> 
    <!-- ... --> 
</TemplateMap> 

और उपयोग प्रतिबिंब एट। अल। IDictionary पॉप्युलेट करने के लिए। आप अभी भी मैपिंग को बनाए रखते हैं, लेकिन अब एक एक्सएमएल फ़ाइल में, जो तैनात करना आसान हो सकता है।

+0

स्पष्टीकरण के लिए फिर से धन्यवाद। आंखों और विचारों का एक और सेट प्राप्त करना हमेशा अच्छा होता है! आपके विचारों ने मुझे विचार करने के लिए कुछ और विचार दिए हैं। एक बार फिर धन्यवाद। रॉबर्ट –

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