.net - आप प्रत्येक ग्राहक के लिए एक ही सॉफ्टवेयर के कई संस्करणों का प्रबंधन कैसे करते हैं?




version-control visualsvn (5)

#ifdef ACME / # endif इत्यादि के लिए उपयोगी सहायक। ACME_ONLY (), NON_ACME (), FROBOZCO_ONLY (), NON_FROBOZCO (), आदि मैक्रोज़ के लिए मैक्रो को परिभाषित करना है। यदि नया संस्करण प्ले में आते हैं, तो सामान अभी भी गड़बड़ हो सकता है (जिसमें नए संस्करण को एक्मे, फ्रोबोजको, इत्यादि की तरह व्यवहार करना चाहिए), लेकिन अगर एक्मे और गैर-एक्मे संस्करण के बीच अंतर की केवल एक पंक्ति होती है, तो यह दृष्टिकोण इसके आस-पास से बचा जाता है # डायरेक्टिव्स की दो पंक्तियों के अनुसार लाइन

मेरे पास स्रोत कोड है जो सभी ग्राहकों के लिए 95% है। कुछ ग्राहक कुछ विशेष पूछते हैं, फिर भी मैं इसे कैसे प्रबंधित कर सकता हूं, क्या यह VisualSVN / सबवर्जन के साथ संभव है?

अद्यतन करें:

आवेदन के बारे में कुछ विवरण, यह एक वेब एएसपी.NET MVC NHibernate के साथ है।

आवेदन में कई परियोजनाएं हैं: वेब पार्ट, रेपो पार्ट (जहां हम डेटाबेस एक्सेस करने के लिए NHibernate का उपयोग करते हैं) और एक सेवा प्रोजेक्ट

सेवा प्रोजेक्ट रेपो प्रोजेक्ट का उपयोग करता है और सेवा प्रोजेक्ट व्यवसाय नियमों के साथ प्रोजेक्ट है I


5% का अंतर यह है कि केवल यूआई आधारित या व्यावसायिक तर्क भी है? अगर यूआई के आधार पर आपको यूआई परत को अलग करना चाहिए और एपप्रोएट यूआई फ़ाइल को आवेदन के साथ कंपाइल करना चाहिए। यदि व्यापार तर्क, यह अधिक जटिल है। शायद शाखाएं (एसवीएन के माध्यम से) मदद कर सकता है। लेकिन अभी भी आवेदन करने के लिए वर्तमान विकास के साथ परेशानी है, इसलिए सलाह नहीं दी।


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

अन्य कम आकर्षक तरीके (आईएमओ) प्रत्येक ग्राहक के लिए अलग-अलग शाखाएं बनाना होगा लेकिन यह जल्दी से बनाए रखने में कठिनाई हो सकती है।


इस समस्या को हल करने के लिए संस्करण नियंत्रण का उपयोग करना संभवत: इससे अधिक समस्याओं का कारण बनता जा रहा है।

दूसरों के सुझावों को क्लाइंट विशिष्ट कोड को अलग-अलग विधानसभाओं में अलग करने और / या निर्भरता इंजेक्शन का उपयोग एक ही तरीका है।

एक और विकल्प #if ... #endif का उपयोग करना है

#if CustomerA

    ... do x ...

#else

    ... do y ...

#endif

विशिष्ट ग्राहक बाइनरी बनाने के लिए आपको अपनी बिल्ड स्क्रिप्ट समायोजित करने की आवश्यकता होगी। उदाहरण के लिए:

msbuild mysolution.sln /property:DefineConstants="CustomerA"

msbuild mysolution.sln /property:DefineConstants="CustomerB"

हमने जो कदम उठाया है वह है:

  • डिफ़ॉल्ट व्यवहार को कस्टमाइज़ करने की अनुमति देकर एप्लिकेशन के अंदर हुक डालें (उदाहरण के लिए जब एक Save एक्शन को कहा जाता है, जो पहले के अंदर होता है, वह OnSaveHandler को कॉल OnSaveHandler )।
  • डिफ़ॉल्ट हैंडलर कुछ भी नहीं करता है, यह सिर्फ "जारी रखने के साथ सामान्य निष्पादन" देता है सभी हैंडलर मूल एप्लिकेशन (अलग-अलग विधानसभा) की तुलना में एक अलग मॉड्यूल में हैं, चलो इसे BehaviourModule कहते हैं
  • क्लाइंट आधारित अनुरोधों पर हम डिफ़ॉल्ट 'कुछ भी व्यवहार नहीं करते' को ओवरराइड करके इस BehaviourModule को संशोधित करते हैं इस संशोधित हैंडलर का रिटर्न कोड निम्न हो सकता है: ContinueNormalExecution SkipNormalExecution , SkipNormalExecution , TerminateExecution , आदि ...
  • अन्य मामलों में हम इंटरफेस के आधार पर हुक जमा करते हैं। DoStuffInterface हमारे पास इस इंटरफ़ेस को लागू करने वाले अधिक हैंडलर होंगे, उदा। DoStuffInterface , DoStuffInterface प्रतिबिंब का उपयोग करके भार समय पर पार्स किया जाता है और DoStuffInterface को लागू करने वाले सभी हैंडलर सिस्टम में पंजीकृत होंगे। फिर मूल आवेदन में हमारे पास कुछ ऐसा होगा: यदि GetDoStuffInterfaceHandler(handlerID) isnot Nothing तो GetDoStuffInterfaceHandler(handlerID) isnot Nothing तो GetDoStuffInterfaceHandler(handlerID).DoStuff() परिभाषित करने के लिए कौन सी हैंडलरआईडी का उपयोग करना है, यह कॉन्फ़िगर करने योग्य है (एक डीबी तालिका, xml फ़ाइल आदि के माध्यम से हो सकता है)।

    हम कई DoStuffInterface को अलग-अलग आईडी के साथ DoStuffInterface लागू करने और उन्हें अलग-अलग समय पर कॉल करने के लिए DoStuffInterface करते हैं।

हमारे पास इस दृष्टिकोण के साथ:

  • डिफ़ॉल्ट व्यवहार के साथ मूल अनुप्रयोग
  • एक विन्यास मॉड्यूल (असेंबली) जिस तरह से आवेदन काम करता है को अनुकूलित करता है

इस दृष्टिकोण के साथ चुनौती "मिठाई अंक" पा रहा है - ऐसे व्यवहार जो क्लाइंट को कस्टमाइज़ करना और हुक को सम्मिलित करना चाहते हैं।

आशा है कि मैं अपने विवरण में स्पष्ट था, अगर नहीं ... एक टिप्पणी छोड़ दो :)





visualsvn-server