मैं पेशकश करता हूं कि यह प्रस्तावित समाधान डेटा टेम्पलेट को डेटा स्रोत को जोड़ने से कम बनाए रखने योग्य नहीं है, जैसा कि वर्तमान में आपके पास है। असल में, मैं अब तक कहूंगा कि आप टेम्प्लेट स्कीमा को दबाकर और डेटाबेस को जानकारी प्रदान करके लचीलापन खोने जा रहे हैं, जिससे आपके एप्लिकेशन को बनाए रखने में कठिनाई होगी।
उदाहरण के लिए, (अगर मैं इस को सही ढंग से समझ रहा हूँ) आप विशेषताओं के साथ इन डेटा स्रोतों है लगता है:
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 पॉप्युलेट करने के लिए। आप अभी भी मैपिंग को बनाए रखते हैं, लेकिन अब एक एक्सएमएल फ़ाइल में, जो तैनात करना आसान हो सकता है।
स्पष्टीकरण के लिए फिर से धन्यवाद। आंखों और विचारों का एक और सेट प्राप्त करना हमेशा अच्छा होता है! आपके विचारों ने मुझे विचार करने के लिए कुछ और विचार दिए हैं। एक बार फिर धन्यवाद। रॉबर्ट –