Я хотел бы знать, что считается лучшими практиками или шаблонами для отделения кода приложения от кода платформы, особенно в отношении OSGi.
Я собираюсь использовать пример из Felix SCRстраницы
Примером службы является Comparator
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, необходимо зарегистрировать его в реестре сервисов.Один из способов, как описано на связанных страницах Феликса, заключается в использовании среды выполнения компонентов службы.
// 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 = ...;
}
}
Используя стратегию поиска SCR, мне нужно добавить методы только для фреймворка:
protected void activate(ComponentContext context) {
Comparator c = ( Comparator ) context.locateService( "sample.component" );
}
Используя стратегию событий SCR, мне также нужно добавить методы только для фреймворка:
protected void bindComparator(Comparator c) {
this.c = c;
}
protected void unbindComparator(Comparator c) {
this.c = null;
}
Ни один из них не очень обременителен, хотя я думаю, что вы, вероятно, в конечном итоге получите достаточное количество кода этого типа, дублированного вклассы, что делает фильтрацию более шумной.
Одним из возможных решений, которое я вижу, было бы использование специального класса OSGi для посредничества между потребителем с помощью более традиционных средств и каркасом.
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);
}
}
Хотя я не уверен, как вы это устроите в конфигурации SCR.
Также есть org.apache.felix.scr.annotations, хотя это означает, что все будет работать только в том случае, еслиты строишь с мейвомн-Scr-плагин.Не так уж плохо на самом деле, и, AFAICT, они не налагают последствий во время выполнения.
Итак, теперь, когда вы все это прочитали, что, по вашему мнению, является лучшим способом использования предоставляемых OSGi сервисов без «загрязнения» кода приложения кодом платформы?