Как создать сервис OSGi с зависимостями и публиковать через DS - PullRequest
2 голосов
/ 05 июля 2010

Мои примеры занятий:

public class MyModel implements Model
{
    :
    :
}

public class SingleModelProvider implements ModelProvider
{
    public SingleModelProvider(Model providedModel, List actions)
    {
          :
    }
}

План состоит в том, чтобы повторно использовать класс SingleModelProvider в нескольких пакетах, чтобы обеспечить различные реализации ModelProvider. Что мне нужно сделать в каждом пакете, так это просто создать экземпляр SingleModelProvider с соответствующими параметрами для конструктора. Довольно простой сценарий с использованием любой DI-инфраструктуры. Я хотел бы зарегистрировать службы ModelProvider, используя DS (декларативные службы), если это возможно, без необходимости писать стандартный код в активаторе.

Возможно ли это?

Кажется, я не могу найти никакой документации о том, как это сделать, поскольку объявление класса в DS, похоже, не допускает аргументы конструктора (или сеттеры в этом отношении).

Использую ли я фабрику? Я не уверен, стоит ли это делать, поскольку это может упростить задачу, чем использование активатора и службы публикации вручную.

Ответы [ 2 ]

3 голосов
/ 11 июля 2010

DS поддерживает сеттеры.Вот пример DS xml, основанный на примере в вашем вопросе.

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="SampleModelProvider">
   <implementation class="test.SampleModelProvider"/>
   <reference bind="setModel" cardinality="1..1" interface="test.Model" name="Model" policy="static" unbind="unsetModel"/>
   <reference bind="setList" cardinality="1..1" interface="test.ActionList" name="ActionList" policy="static" unbind="unsetList"/>
   <service>
      <provide interface="test.ModelProvider"/>
   </service>
</scr:component>

Использование аргументов конструкторов несколько противоречит динамической природе OSGi.Сервисы и пакеты могут быть запущены и остановлены в любое время.Дружественный к OSGi код должен понимать это и иметь симметричные методы для обработки установки и сброса зависимостей.

Один вопрос для вас: в вашей системе кто отвечает за создание объектов модели и список действий, которые выхотите, чтобы каждый провайдер получал?Доступны ли они как сервисы OSGi?Пример DS, который я предоставил, предполагает, что они являются сервисами OSGi.

1 голос
/ 06 июля 2010

Существует ли конкретная причина, по которой вы хотите использовать DS?

Вы также можете использовать службы OSGI Blueprint, как описано в OSGI Service Compendium версии 4.2 , 121. Он предоставляетлучший из двух миров: DI и легкая служба публикации / потребления.

Насколько мне известно, в DS единственный вариант - использовать фабрику, методы bind / unbind не принимают пользовательские классы.(Как описано в OSGI Service Compendium версии 4.2 , 112.4.5)

...