2012-04-27 10 views
6

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

यदि डीएस इसका समर्थन नहीं करता है तो क्या एक और ओएसजीआई निर्भरता इंजेक्शन फ्रेमवर्क (ब्लूप्रिंट, आईपोजो इत्यादि) इसका समर्थन करेगा?

उत्तर

7

आप हमेशा प्रथम स्तर के फ़िल्टर को चित्रित करने के संदर्भ के लक्ष्य विशेषता का उपयोग कर सकते हैं। यदि आपके बाइंड विधि में हस्ताक्षर

void <method-name>(<parameter-type>, Map); 

फिर आप मानचित्र पर किसी गतिशील फ़िल्टर को चला सकते हैं जिसमें सेवाओं के गुण होते हैं। यदि फ़िल्टर मेल नहीं खाता है, तो आप उस घटक को अनदेखा कर सकते हैं (समय के लिए।)

वैकल्पिक रूप से, क्योंकि घटक की कॉन्फ़िगरेशन में संदर्भ का लक्ष्य फ़िल्टर हो सकता है, आप लक्ष्य फ़िल्टर को बदलने के लिए घटक की कॉन्फ़िगरेशन को संशोधित कर सकते हैं।

+0

मैंने आपके पहले सुझाव के साथ खेला और ऐसा लगता है कि यह हमारी आवश्यकताओं को ठीक से ठीक करेगा। धन्यवाद। – rancidfishbreath

5

मैं निम्नलिखित चाल का उपयोग करता हूं। यदि आप सेवा संदर्भ पर "लक्ष्य" विशेषता निर्दिष्ट करते हैं लेकिन खाली स्ट्रिंग के रूप में अपना मान छोड़ दें, तो एक ही नाम वाली एक घटक संपत्ति लेकिन ".target" प्रत्यय रनटाइम पर उपयोग की जाएगी।

नीचे दिए गए उदाहरण में, मैं अपने करफ कंटेनर में एक .cfg फ़ाइल के माध्यम से गतिशील रूप से अपने जेडीबीसी स्रोत का चयन करता हूं। "Datasourcefactory.target" संपत्ति को स्वचालित रूप से "डेटासॉरफैक्टरी" संदर्भ के "लक्ष्य" विशेषता में इंजेक्शन दिया जाता है।

चेतावनी: मुझे वास्तव में पता नहीं है कि यह चाल आधिकारिक रूप से समर्थित है या सिर्फ फ़ेलिक्स एससीआर सुविधा है। मैं इसका उल्लेख यह देखने के लिए किया गया है कि क्या इसका उल्लेख किया गया है ... किसी भी टिप्पणी के लिए +1 जो इसकी वैधता को स्पष्ट करता है!

@Component(
      name = "...", 
      specVersion = "1.1", 
      policy = ConfigurationPolicy.REQUIRE, 
      metatype = true 
    ) 
    @Property(name = "dataSourceFactory.target", 
      value = "", 
      label = "dataSourceFactory target", 
      description = "An OSGi service filter to select the data source provider. "+ 
        "For example: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' where 'derby' is the important bit and the rest is boilerplate. "+ 
        "See DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)." 
    ) 
    @Reference(
      name = "dataSourceFactory", 
      referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class, 
      cardinality = ReferenceCardinality.MANDATORY_UNARY, 
      target = "", // must be overwritten by configuration property named "dataSourceFactory.target" 
      bind = "bindDataSourceFactory", 
      unbind = "unbindDataSourceFactory" 
    ) 
+5

ओएसजीआई 4.2 सेवा संग्रह का खंड 112.3.4 उल्लेख करता है: * "नियोक्ता उस घटक के लिए कॉन्फ़िगरेशन स्थापित करके लक्षित संपत्ति भी सेट कर सकता है जो लक्ष्य संपत्ति का मूल्य निर्धारित करता है। इससे नियोक्ता लक्ष्य लक्ष्य को ओवरराइड करने की अनुमति देता है घटक विवरण। "* - यह एक आधिकारिक विशेषता है। –

+0

धन्यवाद, @ BjörnPollex! –

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