मैं एक नया समाधान तैयार कर रहा हूं, जो प्रकृति द्वारा बहुत मॉड्यूलर है और एक ऐसी संरचना बनाना चाहते हैं, जो आसान भविष्य के विस्तार, चिंताओं के स्पष्ट पृथक्करण, मॉड्यूल द्वारा लाइसेंसिंग आदि की अनुमति देने के लिए उस डिजाइन का समर्थन करती है। वेब पर मॉड्यूलर या समग्र अनुप्रयोगों के बारे में पाया गया कि यूआई-केंद्रित हैं, सिल्वरलाइट, डब्ल्यूपीएफ, आदि पर केंद्रित हैं। मेरे मामले में, मैं एक डब्ल्यूसीएफ सेवा एप्लिकेशन विकसित कर रहा हूं, जो विभिन्न यूआई परियोजनाओं पर काम करने वाले अन्य डेवलपर्स द्वारा सेवन किया जाएगा।
पृष्ठभूमि
मेरी परियोजना का लक्ष्य हमारे व्यापार अनुप्रयोगों में से कई का समर्थन करने के लिए व्यवसाय / डोमेन तर्क का एक केंद्रीकृत स्रोत बनाना है जो वर्तमान में डुप्लिकेट प्रक्रिया, नियमों आदि का समर्थन करता है और जबकि प्रतिरूपकता का हर लाभ प्राप्त नहीं किया जाएगा, मैं इसे जब्त करना चाहता हूं। एक ढांचा स्थापित करने का अवसर जो उन हिस्सों का लाभ उठाएगा जिनका हम लाभ उठा सकते हैं।
मैंने सेवा एप्लिकेशन द्वारा उजागर एपीआई को देखकर डिजाइन शुरू किया है। यह स्पष्ट है कि सेवाओं को उन मॉड्यूलर लाइनों के साथ अलग किया जा सकता है, जिन पर मैं विचार कर रहा था। उदाहरण के लिए, मेरे पास वित्त सेवा, इन्वेंटरी सेवा, कार्मिक सेवा आदि सेवाएं होंगी, जो मेरे सेवा संचालन को एपीआई में उच्च-सामंजस्य प्रदान करने के लिए समूह बनाती हैं, जबकि कपलिंग को कम रखते हुए इसलिए ग्राहकों को केवल उन सेवाओं का उपभोग करना होगा जो उनके आवेदन के अनुकूल हैं।
यह मेरे लिए समझ में आता है कि फिर मैं इनमें से प्रत्येक सेवा के लिए अलग-अलग मॉड्यूल रख सकता हूं, जैसे कि MyApp.Finance, MyApp.Inventory, My.Personnel और इतने पर। क्रॉस-कटिंग चिंताओं और साझा प्रकार MyApp साझा विधानसभा में होंगे। यहां से मैं थोड़ा बंध गया।
(ओह, मुझे यह उल्लेख करना चाहिए कि मैं आवेदन को शिथिल-युग्मित रखने के लिए डिपेंडेंसी इंजेक्शन के लिए एक IoC कंटेनर का उपयोग करूंगा। मैं यह उल्लेख नहीं करूंगा कि मैं कौन सा भानुमती का डिब्बा नहीं खोलना चाहता!)
MyApp.ServiceHost में, मैं उदाहरण के लिए प्रत्येक मॉड्यूल, FinanceService.svc के अनुरूप एक सर्विस होस्ट फ़ाइल (.svc) बनाएगा। सेवा होस्ट को उस सेवा के नाम की आवश्यकता होती है जो कॉन्फ़िगरेशन फ़ाइल में जानकारी से मेल खाती है जिसमें सेवा अनुबंध को परिभाषित करने वाला इंटरफ़ेस शामिल है। IoC कॉन्फ़िगरेशन का उपयोग करने के लिए इंटरफ़ेस के कंक्रीट कार्यान्वयन को मैप करने के लिए किया जाता है।
1. क्या सेवा परत को एपीआई को लागू करना चाहिए और मॉड्यूल को सौंपना चाहिए या मॉड्यूल स्व-निहित होना चाहिए (इसमें वे उस मॉड्यूल से संबंधित सब कुछ शामिल हैं, जिसमें सेवा कार्यान्वयन शामिल है)?
समस्या से संपर्क करने का एक तरीका MyApp.Services "मॉड्यूल" है जिसमें सेवा अनुबंधों का कार्यान्वयन शामिल है। प्रत्येक सेवा वर्ग बस एक और वर्ग इंट एह उपयुक्त मॉड्यूल को सौंपता है जिसमें ऑपरेशन के लिए डोमेन लॉजिक होता है। उदाहरण के लिए, MyApp.Services में FinanceService WCF वर्ग एक अन्य इंटरफ़ेस को दर्शाता है जो ऑपरेशन को करने के लिए वित्त मॉड्यूल में कार्यान्वित किया जाता है। यह मुझे एक पतली सेवा को बनाए रखने और 'प्लग-इन' सेवा को लागू करने और WCF के बारे में चिंता करने के लिए मॉड्यूल की आवश्यकता को खत्म करने की अनुमति देगा, उदाहरण के लिए।
दूसरी ओर, शायद यह प्रत्येक मॉड्यूल को स्वयं के लिए प्राथमिकता देता है कि इसमें इंटरफ़ेस और कार्यान्वयन हो। सेवा होस्ट मॉड्यूल में पाए जाने वाले सेवा अनुबंध इंटरफ़ेस को संदर्भित करता है और IoC को मॉड्यूल से उपयुक्त कार्यान्वयन का उपयोग करने के लिए कॉन्फ़िगर किया गया है। इसका मतलब यह है कि एक नया मॉड्यूल जोड़ना एक नई .svc फ़ाइल और IoC कॉन्फ़िगरेशन जानकारी जोड़ने के अलावा सर्विस लेयर में कोई बदलाव नहीं किया जा सकता है।
मैं उस प्रभाव के बारे में सोच रहा हूं यदि मैं मानक WCF से एक RESTful सेवा इंटरफ़ेस पर स्विच करता हूं या शायद RIA सेवाओं या कुछ पर जा सकता हूं। यदि प्रत्येक मॉड्यूल में सेवा अनुबंध का कार्यान्वयन शामिल है, तो मुझे सेवा तकनीक या दृष्टिकोण को बदलने पर प्रत्येक मॉड्यूल में परिवर्तन करना होगा। लेकिन, यदि मोहरा इसका अपना मॉड्यूल है, तो मुझे केवल एक बदलाव करने के लिए उस हिस्से को स्वैप करना होगा। मॉड्यूल तो अनुबंधों (इंटरफेस) के एक अलग सेट को लागू करना होगा, संभवतः साझा विधानसभा में परिभाषित किया गया है ???
2. मॉड्यूल और / या निर्भरता के बीच संसाधनों को साझा करने का सबसे अच्छा तरीका क्या है?
उदाहरण के लिए, एक संचालन प्राप्त करना। पहले ब्लश में यह समझ में आता है कि यह इन्वेंट्री मॉड्यूल में जाता है क्योंकि माल प्राप्त करना एक इन्वेंट्री फ़ंक्शन है। हालाँकि, इसमें एक वित्तीय पहलू यह भी है कि हमें एक रसीद तैयार करने और भुगतान को अधिकृत करने की आवश्यकता है।
एक ओर, मैं ऑपरेशन को संप्रेषित करने के लिए कुछ प्रकार के डोमेन ईवेंट / मैसेजिंग का उपयोग करने की अपेक्षा करूंगा। इन्वेंट्री मॉड्यूल एक GoodsReceivedEvent को उठाता है जिसे वित्तीय मॉड्यूल द्वारा रसीद उत्पन्न करने और भुगतान प्रक्रिया शुरू करने के लिए नियंत्रित किया जाता है। हालांकि, इसका मतलब है कि वित्तीय मॉड्यूल को उन इन्वेंट्री आइटमों के बारे में जानना होगा जो प्राप्त हुए थे। मैं बस आईडी द्वारा उनका उल्लेख कर सकता हूं लेकिन क्या होगा यदि मुझे रसीद के लिए अतिरिक्त जानकारी की आवश्यकता है, जैसे कि नाम और / या विवरण, इकाई लागत, आदि? क्या प्रत्येक मॉड्यूल के लिए एक इन्वेंट्री आइटम का अपना संस्करण होना आवश्यक है जो उस मॉड्यूल की आवश्यकताओं के अनुरूप बनाया गया है? उस स्थिति में, GoodsReceivedEvent को हैंडल करते समय वित्तीय मॉड्यूल को इन्वेंट्री आइटम का अपना लुकअप करना होगा।
...
मैंने इस उदाहरण का उपयोग उद्देश्य से किया है क्योंकि मैंने विभिन्न ईआरपी प्रणालियों के साथ बहुत काम किया है और जानता हूं कि वे इस प्रकार के प्रतिरूपकता के साथ डिज़ाइन किए गए हैं - मुझे नहीं पता कि कैसे। मैं भी स्पष्ट रूप से इसके बाद के संस्करण का उल्लेख नहीं करता हूं, लेकिन मैं समाधान को तैयार करने में डोमेन ड्रिवेन डिज़ाइन प्रिंसिपलों का पालन करना पसंद करता हूं और मानता हूं कि इस प्रकार का प्रतिरूप उस क्षेत्र में सही बैठता है।
मेरे सिर को इसके चारों ओर लपेटने में कोई भी मदद बहुत सराहना की जाती है।