एक मॉड्यूलर सेवा आवेदन आर्किटेक्चर


11

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

पृष्ठभूमि

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

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

यह मेरे लिए समझ में आता है कि फिर मैं इनमें से प्रत्येक सेवा के लिए अलग-अलग मॉड्यूल रख सकता हूं, जैसे कि 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 को हैंडल करते समय वित्तीय मॉड्यूल को इन्वेंट्री आइटम का अपना लुकअप करना होगा।

...

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

मेरे सिर को इसके चारों ओर लपेटने में कोई भी मदद बहुत सराहना की जाती है।


1
माफ़ करना। सभी सोच में एक सवाल नहीं मिल सकता है। प्रश्न क्या है?
एस.लॉट

1
प्रश्न चिह्न के लिए देखें। ऐसे कई बिंदु हैं जहाँ मैं विकल्पों की पेशकश करता हूं, लेकिन एक समाधान नहीं है और कई विशिष्ट प्रश्नों को सही रास्ते पर लाने की प्रक्रिया को निर्देशित करने में मदद करता है।
SonOfPirate

1
@SonOfPirate: क्षमा करें। मैं उम्मीद कर रहा था कि आप प्रश्नों को उजागर करने या ज़ोर देने के लिए समय ले सकते हैं ताकि अन्य लोग आपकी सहायता कर सकें।
S.Lott

4
मैं S.Lott से सहमत हूं। मुझे खेद है, लेकिन यह कोई सवाल नहीं है, यह एक धारा-चेतना है। यदि आप इसे एक या दो केंद्रित प्रश्नों के लिए संक्षिप्त करते हैं, और वास्तु संबंधी चिंताओं को क्रियान्वयन के विवरण से अलग करने का प्रयास करते हैं, तो हम आपकी बहुत बेहतर मदद कर सकते हैं।
Aaronaught

1
@SonOfPirate: "आर्किटेक्चर" संरचना के बारे में है और उस संरचना को अन्य डेवलपर्स के साथ संचार कर रहा है। यह वर्णन के साथ शुरू होता है। यह स्पष्टता और पारदर्शिता के स्तर को प्राप्त करना चाहिए जो अन्य डेवलपर्स को पूरी तरह से "प्राप्त" करने की अनुमति देता है और वे जो कुछ भी करते हैं उसमें वास्तु डिजाइन सिद्धांतों का पालन करते हैं।
एस.लॉट

जवाबों:


2

क्या प्रत्येक मॉड्यूल के लिए एक इन्वेंट्री आइटम का अपना संस्करण होना आवश्यक है जो उस मॉड्यूल की आवश्यकताओं के अनुरूप बनाया गया है? उस स्थिति में, GoodsReceivedEvent को हैंडल करते समय वित्तीय मॉड्यूल को इन्वेंट्री आइटम का अपना लुकअप करना होगा। मैं मॉड्यूलरिटी और सूचना साझा करने की आवश्यकता के बीच की रेखा कहां खींचता हूं?

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

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

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

इसलिए संक्षेप में, आपको यह तय करना होगा कि आपको किस तरह का इंटरफ़ेस चाहिए। अधिक प्रतिरूपता कम अनुबंध और इसके विपरीत होती है।

Id'probably मेरे डेटा ऑब्जेक्ट्स के लिए एक साझा लाइब्रेरी का उपयोग करें और एक प्रकाशित सदस्यता पैटर्न के साथ एक केंद्रीय संदेश सेवा, जो मुझे सबसे अच्छा समाधान लगता है।


इसके साथ भी सहमत हैं - मैसेजिंग + पब / उप और साझा पुस्तकालयों के लिए dto अनुबंध (आंतरिक नगेट रेपो)। मैं इस सवाल को सोच रहा था जैसे @SonOfPirate जब तक इस लेख ने इसे मेरे लिए परिप्रेक्ष्य में नहीं रखा: msdn.microsoft.com/en-us/library/bb245678.aspx
diegohb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.