2

我的示例课程:

public class MyModel implements Model
{
    :
    :
}

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

计划是在几个包中重用 SingleModelProvider 类,以提供 ModelProvider 的不同实现。我需要在每个包中完成的是使用构造函数的适当参数简单地实例化 SingleModelProvider。使用任何 DI 框架的非常简单的场景。如果可能,我想使用 DS(声明式服务)注册 ModelProvider 服务,而不必在 Activator 中编写样板代码。

这可能吗?

我似乎找不到任何有关如何完成此操作的文档,因为 DS 中的类声明似乎不允许构造函数参数(或相关的设置器)。

我使用工厂吗?我不确定这是否值得,因为它可能比手动使用激活器和发布服务更简单。

4

2 回答 2

3

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 服务。

于 2010-07-11T15:30:44.700 回答
1

您想使用 DS 是否有特定原因?

您还可以使用OSGI 服务纲要 4.2 版,第 121 版中描述的 OSGI 蓝图服务。它提供了两全其美:DI 和简单的服务发布/消费。

据我所知,在 DS 中唯一的选择是使用工厂,绑定/取消绑定方法不接受用户类。(如OSGI 服务纲要4.2、112.4.5 版中所述)

于 2010-07-05T20:48:28.223 回答