0

让我们想象一个存在于其中的捆绑包:

  • 一个组件负责监听服务注册表中的所有“设备”服务实例。

  • 相同的组件需要一个“适配器工厂”才能通过使用发现的设备创建“适配器”。

  • 该工厂由另一个捆绑包拥有。

我可以通过使用 ServiceTracker(Activator + Service Tracker)解决部分问题:激活器实例化 ServiceTracker,它可以注册“设备”服务中的所有更改。

但是我无法将在其他包中创建的 DS 工厂注入到此服务跟踪器,因为它会导致两个实例(一个由激活器创建且没有成员 /// 另一个由 osgi 创建且具有成员变量 ok 但不能监听“设备”服务的变化)。

那么...我该如何解决这种情况?作为班级成员,我怎样才能拥有一个服务跟踪器(对我来说是完美的)?

4

1 回答 1

1

不使用 Activator,而是使用带有声明式服务 'activate(ComponentContext)' 方法的组件或服务(我们将其称为 A)。在 activate 方法中,您可以像往常一样实例化您的 ServiceTracker。

在 A 的 activate 方法中实例化 ServiceTracker 时,也可以将 AdapterFactory 传入 ServiceTracker。您可以通过将 AdapterFactory 拉出从 ComponentContext 获取的 BundleContext 或(甚至更好)使用 DS 并使其成为 A 组件的服务引用来获取 AdapterFactory。

那就是说:你为什么需要 ServiceTracker?除非我误解,否则您可以使用 DS 绑定和取消绑定来接收有关服务可用性的事件。

编辑:使用多个基数的绑定/取消绑定行为的(旧)示例:http: //blog.tfd.co.uk/2009/11/12/declarative-optional-multiple-references-flaky-in-osgi/

编辑:两种方法的比较,但并没有过多地进入绑定/取消绑定:http: //njbartlett.name/2010/08/05/when-servicetrackers-trump-ds.html

EDIT2:也就是说:我的一般政策是不使用激活器,除非在极少数情况下。使用 DS、ipojo 等,并使用您使用这些技术定义的组件,以便访问 BundleContext 以构建更多低级对象,例如 ServiceTrackers。

于 2013-09-12T15:26:03.017 回答