2011-06-29 11 views
30

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

हालांकि, मेरे बंडल में कक्षाओं से, मैं बंडल कॉन्टेक्स्ट कैसे प्राप्त कर सकता हूं? इसे बंडल एक्टिवेटर में एक सार्वजनिक स्थैतिक क्षेत्र में सौंपना एक तर्क के रूप में इसे बेकार और पास कर रहा है। क्या कोई और बुद्धिमान तरीका है?

+1

मैं इसे दूसरा करता हूं: पीडीई द्वारा उत्पन्न डिफ़ॉल्ट सक्रियकर्ता बहुत संदिग्ध है। मैं इसे एक बग मानता हूं: https://bugs.eclipse.org/bugs/show_bug.cgi?id=392919 – oberlies

उत्तर

44

आप FrameworkUtil.getBundle(ClassFromBundle).getBundleContext() का उपयोग कर सकते हैं।

FrameworkUtil JavaDoc देखें।

+2

धन्यवाद, यह तकनीक ठीक वही है जो मैं बाद में थी। – xconspirisist

+1

यह आपके सक्रियकर्ता में स्थिर चर से बेहतर कैसे है? अपनी खुद की कक्षा के बजाय अब आप एक स्थिर ढांचे विधि पर निर्भर करते हैं। यह आपके कोड को परीक्षण करने के लिए और भी कठिन बनाता है। –

+1

यह जरूरी नहीं है, लेकिन 1. आपको एक्टिवेटर 2 लिखना नहीं है। आप दूसरे बंडल का संदर्भ प्राप्त कर सकते हैं। किसी भी मामले में राडुक ओएसजीआई-विशिष्ट कोड को केंद्रीकृत करने के बारे में सही है। –

-4

यहां कोई जादू नहीं है। आपको अन्य कक्षाओं को जानकारी प्रदान करने के लिए कुछ रास्ता चाहिए। तो यह या तो कॉल स्टैक या कुछ प्रसिद्ध जगह (उदा। स्थिर) में उपलब्ध है।

13

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

इसलिए, स्थिर संदर्भ या फ्रेमवर्क का उपयोग करके पूरे स्थान पर एक अच्छा विचार नहीं है imho। न तो सादा ओएसजीआई का उपयोग कर रहा है। आईपीओजेओ या घोषणात्मक सेवाओं को देखने का प्रयास करें।

+0

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

9

एक अन्य विकल्प घोषणात्मक सेवाओं का उपयोग करना है, जो आपको अपने सक्रियकर्ता विधि में बंडल कॉन्टेक्स्ट प्राप्त करने की अनुमति देता है। उदाहरण के लिए, यह सोचते हैं आप डी एस के लिए BND एनोटेशन का उपयोग करें:

@Activate 
public void activate(BundleContext context) { 
    // ... 
} 

हालांकि के रूप में RaduK ने कहा, यह काफी बेहतर है, तो आप इस तरह के BundleContext साथ OSGi एपीआई का उपयोग किए बिना POJO शैली में अपने कोड के बहुमत लिख सकते है।

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