Лучшая практика слабой связи OSGi

Я хотел бы знать, что считается лучшими практиками или шаблонами для отделения кода приложения от кода фреймворка, особенно в отношении 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;
    }
}

. Приведенный выше код не содержит инфраструктуры, это ' s сфокусированный и лаконичный. Чтобы сделать это доступным для приложения при использовании OSGi, необходимо зарегистрировать его в реестре служб. Один из способов, как описано на связанных страницах Felix, - это использование среды выполнения компонентов службы.

// OSGI-INF/sample.xml


  
  
  
  
    
  

и

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., хотя это означает, что все это будет работать, только если вы строите с помощью maven-scr-plugin. На самом деле не так уж и плохо, и, AFAICT, они не накладывают никаких последствий на время выполнения.

Итак, теперь вы прочитали все это, что вы предлагаете, как лучший способ использования услуг, предоставляемых OSGi, без «загрязнения» кода приложения кодом инфраструктуры?

5
задан ptomli 9 February 2011 в 14:50
поделиться