2012-11-29 10 views
5

मेरे पास विजुअल स्टूडियो 2010 में एक सी # WinForms एप्लिकेशन है जिसका उपयोग दो अलग-अलग ग्राहकों द्वारा किया जाता है। प्रत्येक ग्राहक के लिए आवेदन की मूल कार्यक्षमता समान है, लेकिन कोड की कुछ पंक्तियां (संग्रहीत प्रक्रियाओं, संसाधनों, कुछ व्यवहारों के नाम) संस्करणों के बीच अलग हैं। अब तक, मैंने उसी प्रोजेक्ट में एप्लिकेशन को रखा है, और उपयोग करने के लिए तैनाती के बीच स्विच करने के लिए बिल्डिंग/प्रकाशन करते समय प्रीप्रोसेसर निर्देशों का उपयोग किया है। हालांकि, परियोजना का दायरा एक बिंदु तक बढ़ गया है जहां यह अब संभव नहीं है।एक आवेदन के दो संस्करणों को बनाए रखने और तैनात करने के साथ-साथ

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

+0

प्रीप्रोसेसर निर्देशों का उपयोग शाखाओं को संभालने के लिए नहीं किया जाना चाहिए। –

+0

सहमत हुए। यह एक छोटे से, घर के आवेदन के रूप में शुरू हुआ जो बाहरी ग्राहकों ने रुचि व्यक्त की, इसलिए हमें अलग होने के लिए त्वरित समाधान की आवश्यकता थी। – WickerPopstar

उत्तर

4

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

आपके पास क्लाइंट के आधार पर आवश्यक इंटरफ़ेस लोड करने की क्षमता है। उदाहरण के लिए, आप कॉन्फ़िगरेशन के माध्यम से ऐसा कर सकते हैं। कॉन्फ़िगरेशन मान के आधार पर आप कार्यान्वयन 1 या कार्यान्वयन 2 लोड करते हैं। इस विशेष बिट को पूरा करने के कई तरीके हैं। आपको निर्भरता इंजेक्शन पर नियंत्रण करना चाहिए, नियंत्रण में उलटा होना चाहिए और निनजेक्ट, ऑटोफैक, यूनिटी जैसे टूल्स देखें।

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

+0

मैंने घुमाया था यह एक वास्तुकला समस्या थी, और शब्दावली (निर्भरता इंजेक्शन, आईओसी, आदि) के लिए धन्यवाद। समाधान के लिए खोज करते समय वे शब्द थे जिन्हें मैं याद कर रहा था। – WickerPopstar

2

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

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

+0

मूल मतभेद पहले ही डेटा संचालित हैं, शुक्र है। यह मुख्य रूप से कार्यक्षमता है। मैं उन ढांचे से अपरिचित हूं, लेकिन यह एप्लिकेशन क्लिकऑन परिनियोजन का उपयोग करता है। क्या यह बदलता है कि उन ढांचे को कैसे लागू किया जाता है? – WickerPopstar

+0

मेरे पास मेरी परियोजना में बिल्कुल वही स्थिति है। निनजेक्ट, अन्य डी ढांचे काम करेंगे, लेकिन ऐप इंस्टॉल होने के बाद हम एक यूआरएल से गतिशील रूप से डीएलएल डाउनलोड करते हैं: अन्यथा प्रत्येक ग्राहक को अपने सभी इंस्टॉलेशन में अन्य सभी ग्राहकों के तर्क के साथ एक डीएलएल मिलता है। यह बहुत कुछ नहीं बदलता है, बस आप डिस्क के बजाय यूआरएल से असेंबली लोड करना चाहते हैं। या फिर भी आप इसे डिस्क से क्या कर सकते हैं :) –

0

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

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

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