我的示例课程:
public class MyModel implements Model
{
:
:
}
public class SingleModelProvider implements ModelProvider
{
public SingleModelProvider(Model providedModel, List actions)
{
:
}
}
计划是在几个包中重用SingleModelProvider类,以提供ModelProvider的不同实现。我需要在每个包中完成的是简单地使用适当的参数将SingleModelProvider实例化到构造函数。使用任何DI框架的一个非常简单的场景。如果可能的话,我想使用DS(声明式服务)注册ModelProvider服务,而不必在激活器中编写样板代码。
这可能吗?
我似乎找不到任何关于如何实现这一目标的文档,因为DS中的类声明似乎不允许构造函数参数(或者那个问题的setter)。
我是否使用工厂?我不确定这是否值得,因为它可能使案例不比手动使用Activator和发布服务简单。
答案 0 :(得分:3)
DS确实支持setter。以下是基于您问题中的示例的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 :(得分:1)
您是否有特定原因要使用DS?
您还可以使用OSGI Service Compendium version 4.2,121中所述的OSGI蓝图服务。它提供了两个世界中最好的:DI和简单的服务发布/消费。
在DS中,据我所知,唯一的选择是使用工厂,bind / unbind方法不接受用户类。 (如OSGI Service Compendium version 4.2,112.4.5)
中所述