2010-12-17 18 views
8

यहाँ मुद्दे के व्यापार हिस्सा है:सी # में एक्सएमएल डंप को सामान्यीकृत करने और एकत्रित करने का सबसे अच्छा तरीका क्या है?

  • कई अलग अलग कंपनियों में जानकारी का एक एक्सएमएल डंप भेज संसाधित करने के लिए।
  • कंपनियों द्वारा भेजी गई जानकारी समान हैं ... बिल्कुल वही नहीं।
  • और भी कई कंपनियों के जल्द ही लोग भर्ती हुए और जानकारी

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

क्या इस मुद्दे के लिए कई समस्याओं को बाद में मेरे समाधान को बदलने के बिना सामान्य रूप से संभालने के लिए कोई पैटर्न या समाधान है?

मेरे पार्सर/ट्रांसफार्मर को लिखने का सबसे अच्छा तरीका क्या होगा?

+0

क्या कोई विशिष्ट कंपनी कम से कम एक ही प्रारूप में एक डंप भेजती है या यह विभिन्न डंप के लिए अलग हो सकती है? – InSane

+0

आप xml से xsd उत्पन्न कर सकते हैं और फिर .NET के xsd टूल का उपयोग कर xsd फ़ाइल से क्लास मॉडल उत्पन्न कर सकते हैं। और फिर इस प्रकार के लिए एक असेंबली बनाएं और इसे अपने एप्लिकेशन में प्रतिबिंब का उपयोग करके लोड करें। एप्लिकेशन में कक्षा का उपयोग फिर से सदस्यों से पूछताछ, उदाहरण बनाने और मान असाइन करने के लिए प्रतिबिंब का उपयोग करेगा। –

उत्तर

2

की तरह तुम सिर्फ एक डिजाइन पैटर्न के लिए पूछ रहे हैं (या पैटर्न का समूह) है आप एक सामान्य, भविष्य प्रूफ तरीके से ऐसा करने के लिए, सही इस्तेमाल कर सकते हैं मेरे लिए ध्वनि?

आदर्श रूप में विशेषताओं है कि आप शायद चाहते

  • प्रत्येक "ट्रांसफॉर्मर" के कुछ एक-दूसरे से decoupled है।
  • आप अपने मुख्य "ड्राइवर" दिनचर्या को फिर से लिखने के बिना आसानी से नए "ट्रांसफार्मर" जोड़ सकते हैं।
  • आप पुन: संयोजित/अपने पूरे समाधान हर बार जब आप एक ट्रांसफॉर्मर, संशोधित करने, या कम से कम एक नया जोड़ें पुनर्वितरित की जरूरत नहीं है।

प्रत्येक "ट्रांसफार्मर" आदर्श रूप से एक सामान्य इंटरफ़ेस को कार्यान्वित करना चाहिए जो आपके ड्राइवर की नियमितता के बारे में जानता है - इसे IXmlTransformer कहें। इस इंटरफ़ेस की ज़िम्मेदारी एक एक्सएमएल फाइल लेना और डेटाबेस में सहेजने के लिए उपयोग किए जाने वाले ऑब्जेक्ट मॉडल/डेटासेट को वापस करना है। आपके प्रत्येक ट्रांसफार्मर इस इंटरफेस को लागू करेंगे। सामान्य ट्रांसफॉर्म के लिए जो सभी ट्रांसफॉर्मर्स द्वारा साझा किया जाता है, आप या तो एक आधारित वर्ग बना सकते हैं जो सभी से प्राप्त होता है, या (मेरी पसंदीदा पसंद) में सहायक तरीकों का एक सेट होता है जिसे आप उनमें से किसी से कॉल कर सकते हैं।

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

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

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

मैं रॉबर्ट मार्टिन (http://www.amazon.co.uk/Agile-Principles-Pternterns-Practices-C/dp/0131857258) द्वारा एग्इल सिद्धांतों, पैटर्न और प्रथाओं जैसी पुस्तक पढ़ने की अनुशंसा करता हूं, जो देता है आपके जैसे परिस्थितियों के लिए उचित डिजाइन पैटर्न के अच्छे उदाहरण उदा फैक्टरी और DIP आदि

आशा है कि मदद करता है!

+0

+1 का एक अच्छा समाधान प्रदान करता है: यह उत्तर + अन्य 2 = @GilliVilla – user44298

+0

के लिए एक अच्छे समाधान के लिए होना चाहिए ट्रांसफॉर्मर बनाने के बाद ... आप कहां सुझाते हैं उन्हें स्टोर करने के लिए? – GilliVilla

+0

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

11

इस तरह मैंने अतीत में कुछ ऐसा किया है।

जब तक प्रत्येक कंपनी अपने तय प्रारूप है जो वे अपने एक्सएमएल डंप के लिए उपयोग करते हैं, है

  1. प्रत्येक कंपनी के लिए एक विशिष्ट XSLT है।
  2. यह दर्शाता है जो डंप से जहां (प्रत्येक कंपनी के लिए हो सकता है अलग DUMP फ़ोल्डर)
  3. अपने कार्यक्रम, 2 पर आधारित में, 1 का चयन करें और DUMP
  4. पर लागू सभी XSLT का बदलना होगा प्राप्त किया जाता है का एक तरीका है अपने एक मानक डेटाबेस स्कीमा
  5. सहेजें करने के लिए XML यह आपके डीबी

प्रत्येक नया कंपनी इसके अलावा सबसे एक नया XSLT ऐसे मामलों में जहां स्कीमा बहुत समान है, XSLT सिर्फ फिर से किया जा सकता है पर है इस्तेमाल किया और फिर उन में किए गए विशिष्ट परिवर्तन।

इस दृष्टिकोण पर प्रतिक्रिया: यदि आपके पास सही उपकरण नहीं हैं तो डीएसग्लिंग एक्सएसएलटी थोड़ा और दर्दनाक हो सकता है। हालांकि बहुत सारे एक्सएमएल संपादकों (जैसे एक्सएमएल जासूस इत्यादि) में उत्कृष्ट एक्सएसएलटी डीबगिंग क्षमताएं हैं।

+0

@InSane मैं सिर्फ एक्सएसएलटी की अवधारणा की तलाश नहीं कर रहा हूं ... लेकिन इसे सामान्य रूप से C# – GilliVilla

+0

@GilliVilla में कैसे संभाला जा सकता है - आपके प्रश्न ने सामान्य पैटर्न/समाधान के बारे में बात की थी। अब, मुझे डर है कि मैं समझ नहीं पा रहा हूं कि आप क्या इंगित करने की कोशिश कर रहे हैं। – InSane

+0

@GilliVilla आपने एक ऐसे समाधान के लिए कहा था जिसके लिए आपको अपना समाधान बदलने की आवश्यकता नहीं है। चूंकि आप बाद में विभिन्न प्रकार के एक्सएमएल जोड़ने जा रहे हैं, इसलिए आपको स्पष्ट रूप से कुछ बदलना होगा। यदि परिवर्तनों को बाहरी नहीं किया जाता है तो आप कोड में परिवर्तनों को कैसे रोकना चाहते हैं? – Stefan

1

इनसेन द्वारा प्रस्तावित समाधान सबसे अधिक स्ट्रैघ आगे और निश्चित रूप से एक्सएमएल अनुकूल दृष्टिकोण है।

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

खोज - (निकालें-Trandform लोड) और अधिक जानकारी प्राप्त करने के लिए - What model/pattern should I use for handling multiple data sources?, http://en.wikipedia.org/wiki/Extract,_transform,_load

+0

निश्चित रूप से एक ईटीएल समस्या +1, इनसेन कुछ डिज़ाइन विचार देने के लिए – user44298

1

के रूप में वर्तमान में सबसे upvoted जवाब में प्रस्तावित XSLT का उपयोग करना, बस xslt के लिए समस्या बढ़ रहा है, ग # से।

आप अभी भी उन टुकड़ों को बदल रहे हैं जो xml को संसाधित करते हैं, और आप अभी भी इस बात से अवगत हैं कि कोड कितना अच्छा/खराब है, चाहे वह सी # या xslt में नियम है या नहीं।

भले ही आप इसे सी # में रखते हैं या उन बिट्स के लिए xslt पर जाएं, कुंजी विभिन्न कंपनियों से आपको प्राप्त होने वाले एक्सएमएल के परिवर्तन को एक अद्वितीय प्रारूप में अलग करना है, भले ही वह मध्यवर्ती एक्सएमएल या कक्षाओं का एक सेट हो आप जिस डेटा को संसाधित कर रहे हैं उसे लोड करते हैं।

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

सी # रास्ते पर, परिवर्तनों के बीच संरचना के बीच आपके पास कोई भी पुन: उपयोग रखें, ऐसा करने के लिए विरासत को भी नहीं सोचें ... यह उन क्षेत्रों में से एक है जहां यह बहुत बदसूरत हो जाता है यदि आप उस पर जाते हैं मार्ग।

0

बस यहां बाड़ खेल रहा है और अन्य पाठकों के लिए एक और समाधान पेश कर रहा है।

सी # के भीतर अपने मॉडल में डेटा प्राप्त करने का सबसे आसान तरीका एक्सएसएलटी का उपयोग करना है ताकि प्रत्येक कंपनी डेटा को आपके मॉडल के क्रमबद्ध रूप में परिवर्तित किया जा सके। ये बुनियादी कदम हैं जो मैं लेता हूं:

  1. अपने सभी डेटा का एक पूरा मॉडल बनाएं और मॉडल लिखने के लिए XmlSerializer का उपयोग करें।
  2. एक एक्सएसएलटी बनाएं जो कंपनी ए का डेटा लेता है और इसे आपके डेटा के वैध क्रमबद्ध xml मॉडल में परिवर्तित करता है। संदर्भ के रूप में पहले बनाई गई XML फ़ाइल का उपयोग करें।
  3. आपके द्वारा अभी बनाए गए नए एक्सएमएल पर Deserialize का उपयोग करें। अब आपके पास कंपनी के सभी डेटा वाले मॉडल मॉडल का संदर्भ होगा।
संबंधित मुद्दे

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