代码之家  ›  专栏  ›  技术社区  ›  Robin

如何构造具有依赖关系的OSGi服务并通过DS发布

  •  2
  • Robin  · 技术社区  · 14 年前

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

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

    这可能吗?

    我似乎找不到任何关于如何实现这一点的文档,因为DS中的类声明似乎不允许构造函数参数(或设置器)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Davy Meers    14 年前

    您想使用DS的具体原因是什么?

    OSGI Service Compendium version 4.2 它提供了两个世界中最好的:DI和易服务发布/消费。

    在DS中,据我所知,唯一的选择是使用工厂,绑定/取消绑定方法不接受用户类(如中所述 , 112.4.5)

        2
  •  3
  •   James Branigan    14 年前

    <?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友好的代码需要理解这一点,并且具有处理依赖项的设置和取消设置的对称方法。