मैं जानना चाहता हूं कि फ्रेमवर्क कोड से विशेष रूप से ओएसजीआई के संबंध में एप्लिकेशन कोड को डीकॉप्लिंग करने के लिए सर्वोत्तम प्रथाओं या पैटर्न को क्या माना जाता है।ओएसजीआई ढीला-युग्मन सर्वोत्तम अभ्यास
मैं example from the Felix SCR pages
उदाहरण सेवा का उपयोग करने जा रहा हूँ, एक तुलनाकारी
package sample.service;
import java.util.Comparator;
public class SampleComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
return o1.equals(o2) ? 0 : -1;
}
}
कोड के ऊपर कोई ढांचा पाइपलाइन शामिल है यह ध्यान केंद्रित और संक्षिप्त है। ओएसजीआई का उपयोग करते समय इसे एप्लिकेशन में उपलब्ध कराने में, इसे सेवा रजिस्ट्री के साथ पंजीकृत करना शामिल है। एक तरीका, जैसा कि फ़ेलिक्स पृष्ठों से जुड़ा हुआ है, सेवा घटक रनटाइम का उपयोग करके है।
// OSGI-INF/sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<component name="sample.component" immediate="true">
<implementation class="sample.service.SampleComparator" />
<property name="service.description" value="Sample Comparator Service" />
<property name="service.vendor" value="Apache Software Foundation" />
<service>
<provide interface="java.util.Comparator" />
</service>
</component>
और
Service-Component: OSGI-INF/sample.xml
सभी अच्छा और प्यारा है, मेरी सेवा कार्यान्वयन कोई युग्मन बिल्कुल OSGi गया है।
अब मैं सेवा का उपयोग करना चाहते हैं ...
package sample.consumer;
import java.util.Comparator;
public class Consumer {
public void doCompare(Object o1, Object o2) {
Comparator c = ...;
}
}
एससीआर देखने रणनीति का उपयोग करते हुए मैं ढांचा-केवल तरीकों जोड़ने की जरूरत:
protected void activate(ComponentContext context) {
Comparator c = (Comparator) context.locateService("sample.component");
}
एससीआर घटना रणनीति का उपयोग करते हुए मैं भी जोड़ने की जरूरत ढांचा-केवल विधि:
protected void bindComparator(Comparator c) {
this.c = c;
}
protected void unbindComparator(Comparator c) {
this.c = null;
}
न तो बहुत भारी है, हालांकि मुझे लगता है कि यह संभव है आप वाई पहुंचते हैं कक्षाओं में डुप्लिकेट किए गए इस प्रकार के कोड की उचित मात्रा, जो इसे फ़िल्टर करने के लिए अधिक शोर बनाता है।
एक संभावित समाधान जो मैं देख सकता हूं, उपभोक्ता के बीच मध्यस्थता के लिए ओएसजीआई विशिष्ट वर्ग का उपयोग करना होगा, अधिक पारंपरिक माध्यमों और ढांचे के माध्यम से।
package sample.internal;
public class OsgiDependencyInjector {
private Consumer consumer;
protected void bindComparator(Comparator c) {
this.consumer.setComparator(c);
}
protected void unbindComparator(Comparator c) {
this.consumer.setComparator(null);
}
}
हालांकि मुझे यकीन नहीं है कि आप इसे एससीआर कॉन्फ़िगरेशन में कैसे व्यवस्थित करेंगे।
org.apache.felix.scr.annotations भी है, हालांकि इसका मतलब है कि यह केवल तभी काम करेगा जब आप मेवेन-स्क्र-प्लगइन के साथ निर्माण कर रहे हों। वास्तव में इतना बुरा नहीं है और, AFAICT, वे कोई रनटाइम प्रभाव नहीं लगाते हैं।
तो, अब आप यह सब पढ़ चुके हैं, आप ओएसजीआई प्रदान किए गए सेवाओं को फ्रेमवर्क कोड के साथ 'प्रदूषण' एप्लिकेशन कोड के बिना उपभोग करने का सबसे अच्छा तरीका क्या है?