2013-11-20 7 views
6

मैंने अभी आकार के साथ Apache Felix Application Demonstration की पूरी तरह से समीक्षा की है। लेख राज्य:सर्विस मॉडल बनाम एक्स्टेंडर मॉडल?

जब एक OSGi आधारित अनुप्रयोग बनाने वहाँ दो मुख्य ओर्थोगोनल मुद्दों पर विचार करने के हैं:

  1. सेवा मॉडल बनाम एक्सटेंडर मॉडल
  2. बंडल आवेदन बनाम की मेजबानी की रूपरेखा

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

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

पहले बिंदु के बारे में, सेवा मॉडल और विस्तारक मॉडल दोनों का अध्ययन करने के बाद मैं उनके बीच अंतर को समझता हूं, लेकिन मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि विभिन्न मॉडलों के फायदे और नुकसान क्या हैं।

प्रत्येक मॉडल (सेवा बनाम विस्तारक) के फायदे और नुकसान क्या हैं और यह निर्धारित करने के लिए सबसे अच्छा प्रथा क्या है कि कौन सा उपयोग करना है या जब दोनों के संयोजन का उपयोग करना उचित होगा?

उत्तर

12

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

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

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

उदाहरण के लिए, मान लें कि आप अपने आवेदन के लिए एक सहायता प्रणाली को कार्यान्वित करना चाहते हैं। बंडलों में बस कुछ सहमत पथ के तहत एक HTML दस्तावेज़ हो सकता है, और केंद्रीय सहायता प्रणाली बंडल इन दस्तावेज़ों को ढूंढने के लिए बंडल स्कैन कर सकता है और उन्हें मुख्य सहायता सूचकांक में जोड़ सकता है। सेवाओं के साथ ऐसा करना काफी बोझिल होगा: मान लें कि आप "व्हाइटबोर्ड" शैली का पालन करते हैं, आपको HelpProvider जावा इंटरफ़ेस को getHelpDocuments() विधि के साथ परिभाषित करना होगा; सहायता प्रदान करने के इच्छुक हर बंडल को इस इंटरफेस को लागू करना होगा और इसे एक सेवा के रूप में पंजीकृत करना होगा। दूसरी ओर, हेल्प सिस्टम एक्स्टेंडर बंडल अपेक्षाकृत स्मार्ट होने की आवश्यकता है क्योंकि इसे आने वाले और जाने वाले बंडलों को ट्रैक करना होता है। लेकिन कम से कम आपको केवल एक बार इस स्मार्ट कोड को लिखना होगा। - instantiating घटकों, प्रकाशन सेवाओं आदि

  • घोषणात्मक सर्विसेज एक एक्सटेंडर कि उनकी ओर से अन्य बंडलों में Service-Component घोषणा के लिए लग रहा है और सामान के सभी प्रकार करता है: extenders की

    वास्तविक जीवन उदाहरण इस प्रकार हैं

  • ब्लूप्रिंट एक विस्तारक है जो कुछ समान करता है। यह Bundle-Blueprint घोषणा, या एक सहमत मार्ग के तहत एक्सएमएल फाइलों की तलाश में है।
  • ओएसजीआई एंटरप्राइज़ विनिर्देश एक जेपीए विस्तारक को परिभाषित करता है जो Meta-Persistence हेडर द्वारा घोषित persistence.xml फ़ाइल वाले बंडलों की तलाश करता है। जब यह एक पाता है तो वह उस बंडल के लिए एक पर्सिस्टेंस यूनिट बनाता है।
  • ग्रहण में दृश्य, परिप्रेक्ष्य, मेनू इत्यादि जैसी चीजें बनाने के लिए एक विस्तारक (भ्रमित रूप से विस्तार रजिस्ट्री कहा जाता है) शामिल हैं। इन सभी को बंडल की जड़ में plugin.xml फ़ाइल में घोषित किया गया है।

संक्षेप में ... सेवाओं का उपयोग अनुबंध के आधार पर वस्तुओं को पंजीकृत करने और खोजने के लिए किया जाता है। विस्तारक बंडलों की कार्यक्षमता को विस्तारित करने के लिए होते हैं, आमतौर पर निष्पादन योग्य कोड के बजाए किसी प्रकार के घोषणात्मक संसाधन या शीर्षलेख के आधार पर।

+0

ओपी यह थोड़ा सा आवाज बनाता है जैसे कि इन दो दृष्टिकोण परस्पर अनन्य थे, इसलिए मुझे स्पष्ट रूप से मजबूर होना लगता है कि वे घोषणात्मक सेवाओं (तत्काल सेवाओं के लिए उपयोग किए जाने वाले विस्तारक) द्वारा प्रदर्शित नहीं हैं। –

5

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

सेवा मॉडल आपके एप्लिकेशन के लिए सही चीज है। सेवाएं कार्यान्वयन के विवरण के साथ-साथ सेवा के उपयोगकर्ता से तत्कालता को छिपाने की अनुमति देती हैं। तो यह ढीला युग्मन के लिए बहुत अच्छा है।

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

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