Как написать фабричный шаблон в OSGi? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть несколько классов Impl, которые реализуют один и тот же сервис.Мне нужно написать один класс фабрики в OSGI, где я должен написать метод getter для возврата соответствующего объекта Impl.Ниже приведен код, который я пробовал.Я поражен в заводском классе.Любые идеи, чтобы продолжить?

public interface ServiceA {
   public void display();
}

@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test1 implements ServiceA{

      public void display(){
        Log.debug("Test1");
      }
}

@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
class Test2 implements ServiceA{

      public void display(){
        Log.debug("Test2");
      }
}

//How to write factory ?
class Factory{

    public ServiceA getObject(String testType){
         if(testType.equals("Test1")){
             return Test1;
         }
         else{
             return Test2;
         }
    }
}

1 Ответ

0 голосов
/ 09 марта 2019

Хотя неясно, как ваше приложение намеревается использовать эти различные реализации сервисов, один из способов сделать это - использовать свойства сервиса, а затем потребовать это свойство при фактической ссылке на эти сервисы у потребителя сервиса, например:

@Component (description = "Test1 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test1")
class Test1 implements ServiceA{
    // ...
}

@Component (description = "Test2 service", ds = true, immediate = true)
@Service (value = {ServiceA.class})
@Property (name = "type", value = "test2")
class Test2 implements ServiceA{
    // ...
}

... и на стороне потребителя вы просто добавляете критерии выбора услуг для справки, например:

@Component (...)
class MyConsumer {
    // ...

    @Reference(target="(type=test2)")
    ServiceA testService2;

    // ...
}

Фабрики не нужны!:)

Для получения дополнительной информации посмотрите эту небольшую статью .

Если вам нужно динамически маршрутизировать к конкретной реализации службы на основе атрибутов запроса службы времени выполнения,Вы также можете хранить ссылку на все реализации сервиса и отображать их, используя желаемое свойство для быстрого выбора, например:

@Component (...)
class MyConsumer {
    // ...
    private final Map<String, ServiceA> services = // ...

    @Reference(
            cardinality = ReferenceCardinality.MULTIPLE,
            policy = ReferencePolicy.DYNAMIC,
            service = ServiceA.class,
            target = "(type=*)"
    )
    public void addServiceA(ServiceA instance, Map properties) {
        service.put(String.valueOf(properties.get("type")), instance);
    }

    public void removeServiceA(Map properties) {
        service.remove(String.valueOf(properties.get("type")));
    }

    // ...
}
...