2010-07-16 16 views
5

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

  • ब्लॉग मेज पर विदेशी कुंजी से नई गैलरी तालिका जोड़ने है इस सामान्य स्थिति में आसान होगा।
  • Linq2SQl कोड पुन: उत्पन्न करें और मॉडल को अद्यतन करें।
  • बनाएं, संपादित करें, हटाएं दृश्यों में नए फॉर्म तत्व जोड़ें।
  • नियंत्रक में तर्क जोड़ें।

लेकिन मेरी स्थिति में यह जटिल और समय बोझिल है, क्योंकि 2 कारणों

की
  • अगर नई कार्यक्षमता शांत और ग्राहक सभी साइटों में इसे लागू करने का फैसला है, तो मैं दोहराना प्रत्येक साइट के लिए काम करते हैं।
  • अगर कार्यक्षमता अद्वितीय यह भविष्य

है कि मेरे लिए विसंगति पैदा करेगा यही कारण है कि मैं पोर्टेबल क्षेत्रों में प्रयोग किया जाता प्रत्येक मॉड्यूल के लिए ऐड-ऑन बनाने के लिए, अब यह निश्चित रूप से मेरे काम को कम होगा समस्या का समाधान करने के लिए पहले कदम के रूप प्रत्येक नए मॉड्यूल या एडऑन के 1 DLL खींच, लेकिन मैं यहाँ एक छोटे से समस्या है, जो

  • नए मॉड्यूल या ऐड एक Dll है क्योंकि द्वारा, मैं कैसे मेरे व्यवस्थापक पैनल में इस तरह के एक कार्यक्षमता बना सकते हैं नया एडन इंस्टॉल करें या कोई नयाखोजेंजोड़ा मॉड्यूल/Addon मुख्य आवेदन
  • क्या अद्यतन की तरह पोर्टेबल क्षेत्र के अंदर एक अधिष्ठापन प्रक्रिया बनाने के लिए, अभ्यास सबसे अच्छा है डीबी, न्यू मार्गों, आदि के लिए नए DLLS घसीटा ..
सबसे बड़ी समस्या जो मॉड्यूल युद्ध करने के लिए :) विशिष्ट है

अब हम अनुच्छेद गैलरी Addon वापस ले, अगर मैं तर्क मैं एक पोर्टेबल क्षेत्र के रूप में यह बनाने के द्वारा जैसा कि ऊपर उल्लेख किया है का पालन करें, यह आसान होगा चलो सभी स्थापित एडॉन्स के माध्यम से मॉड्यूल कोड में लूप को कार्यक्षमता बनाने के लिए और उन्हें CRUD दृश्यों में सूचीबद्ध करने के लिए, लेकिन क्योंकि मैंने एडन को अलग किया है और ऊपर के कारणों के लिए मुख्य मॉड्यूल कोड मैन्युअल रूप से अपडेट नहीं करना चाहते हैं, इसके लिए कोई रास्ता नहीं होगा मुख्य मॉड्यूल के साथ सिंक में नए एडॉन्स के लिए सीआरयूडी ऑपरेशन कर रहा है क्योंकि कोई विदेशी कुंजी संबंध नहीं है, क्योंकि मैंने ऊपर कहा है कि यह वैकल्पिक हो सकता है, इसलिए मैंने निम्न समाधान के बारे में सोचा जो मुझे उम्मीद है कि बेहतर होगा

स्थापना प्रक्रिया में सबसे पहले मैं गैलरी एडन के लिए एक टेबल तैयार करूंगा, लेकिन एक विदेशी कुंजी संबंध बनाने के बजाय मैं एक मैन्युअल विदेशी कुंजी तैयार करूंगा जो मुख्य मॉड्यूल नियंत्रक में एक अद्वितीय आईडी उत्पन्न करके पॉप्युलेट हो जाएगा जब मैं उपयोग करके रिकॉर्ड बनाउंगा निम्नलिखित कोड तो

private string GenerateId() 
{ 
    long i = 1; 
    foreach (byte b in Guid.NewGuid().ToByteArray()) 
    { 
    i *= ((int)b + 1); 
    } 
    return string.Format("{0:x}", i - DateTime.Now.Ticks); 
} 
ViewData["FK"] = GenerateId(); 

ViewData में संग्रहीत और जब मैं नया रिकार्ड बनाने के सिर्फ युद्ध नियंत्रक को इसे पारित, लेकिन यहाँ मेरी चिंताएं हैं

  • इस तरह से संभव है या सिर्फ सादा बेवकूफ है ।
  • यह तकनीक वास्तव में अद्वितीय कुंजी उत्पन्न करेगी।

मैं अगर मेरे सवाल लंगड़ा है अत्यंत खेद है, लेकिन इस सबसे अच्छी जगह पूछना है और मुझे लगता है कि कई लोगों को इस तरह के एक कार्यक्षमता है चाहेगा और आशा है कि कोई मुझे

+2

यह बिल्कुल एक लंगड़ा सवाल नहीं है, लेकिन यह * एक डिज़ाइन प्रश्न है, जिसमें थोड़ा विचार होना आवश्यक है। मुझे नहीं लगता कि आपके डेटाबेस डिज़ाइन को आपको अपनी खुद की आईडी बनाने की आवश्यकता होनी चाहिए, हालांकि।मेरी वृत्ति यह है कि प्लगइन को एक दूसरे से अलग करने के लिए एक अतिरिक्त कॉलम के साथ, आपको अपनी सभी प्लगइन जानकारी (यदि आप यही कर रहे हैं) वाली एक तालिका की आवश्यकता है। यह आपको सभी प्लगइन के लिए एक ही लिंक से SQL स्कीमा का उपयोग करने की अनुमति देगा। यदि किसी विशेष प्लगइन के लिए अनन्य जानकारी है, तो आप उस प्लगइन की अनूठी जानकारी के लिए SQL स्कीमा में एक अलग लिंक बना सकते हैं। –

+1

एसक्यूएल स्कीमा के लिए अलग लिंक प्लगइन के साथ रह सकता है, ताकि जब भी आप अद्वितीय जानकारी के साथ प्लगइन जोड़ते हैं तो आपको मुख्य लिंक को SQL स्कीमा में अपडेट करने की आवश्यकता नहीं होती है। यह कई तरीकों में से एक है जिसकी समस्या को हल किया जा सकता है। –

+0

धन्यवाद दोस्तों, लेकिन क्या आप मुझे बता सकते हैं कि प्लगइन स्कीमा में केवल मुझे प्लगइन टेबल्स में क्या शामिल करना चाहिए? एक और समस्या जो अभी भी मौजूद है, मैं प्लग इन के साथ नए डाले गए रिकॉर्ड को कैसे जोड़ सकता हूं, क्या मैंने इसका उल्लेख किया है या बेहतर तरीका है? – DevMania

उत्तर

2

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

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

मुझे यकीन नहीं है कि यह एक उत्तर है, तो मैं सिर्फ जोर से सोच रहा हूं। उम्मीद है कि यह चर्चा को थोड़ा सा मदद करेगा।

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

kernel.Load("*.Plugin.dll"); 

जहां गिरी एक Ninject.IKernel और उस पंक्ति किसी भी है कि फाइल पैटर्न मिलान विधानसभा स्कैन करेगा है, इसलिए मैं Weather.Plugin.dll की तरह एक सभा में छोड़ सकता है ।

+0

भार सोचने के लिए धन्यवाद आदमी, वास्तव में मैं जो करना चाहता हूं वह आपके जैसा ही है, साइटें एक केंद्रीय डीबी पर नहीं चल रही हैं, मेरा मतलब यह है कि प्रत्येक साइट पर मुख्य डीबी स्कीमा दोहराया जाएगा, मेरी समस्या यह है कि मैं उन प्लगइन्स को चाहता हूं जिनके पास नए डाले गए मुख्य ब्लॉग आलेख की आईडी प्राप्त करने के लिए कोई मजबूत विदेशी कुंजी संबंध नहीं है, उदाहरण के लिए, इसलिए जब मैं क्वेरी करता हूं तो मैं उन्हें एक साथ जोड़ सकता हूं, और मुझे लगता है कि एक और चीज़, क्या कर सकता है आप मुझे बताते हैं कि आप उन नई असेंबली के लिए कैसे खोज करते हैं, मेरा मतलब है कि कोई भी छोटा कोड मदद करेगा :) – DevMania

+1

मेरे उत्तर w/स्कैनिंग कोड को अपडेट किया गया। मुझे यकीन नहीं है कि जब आप पूछताछ करते हैं तो "उन्हें एकसाथ कनेक्ट करें" से आपका क्या मतलब है। क्या आप मुझे बता सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? –

+0

कीओल मैन, मेरा पूछताछ करते समय मेरा क्या मतलब था, अगर आप ऊपर अपना प्रश्न पढ़ते हैं, तो मैंने उल्लेख किया है कि मेरे पास बेस ब्लॉग मॉड्यूल होगा, और शायद एक नया एडन (प्लगइन) जो आपको लेख में छवियां जोड़ने देगा, अब मेरी समस्या यह है कि मैंने उल्लेख किया है कि जब मैं एक नया आलेख डालता हूं, तो मैं इसे आईडी प्राप्त कर पाऊंगा और इसे गैलरी प्लगइन में एक विदेशी कुंजी बनाउंगा ताकि जब मैं लेख दिखाना चाहता हूं, तो मैं अनुच्छेद तालिका में क्वेरी में शामिल हो सकता हूं + गैलरी प्लगइन टेबल, मूल रूप से मेरा संघर्ष तब होता है जब मैं सहेजता हूं, मुझे एक तंत्र चाहिए जो नई आलेख आईडी प्राप्त करेगी और उदाहरण के लिए इसे – DevMania

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