OSGi应用程序设计 - 我是否滥用服务框架?

Zol*_*tan 4 service osgi design-patterns

在我们正在开发的应用程序中,我有一个用于实现数据提供程序组件的通用接口,我将这些提供程序作为服务挂钩.

我的一位同事建议,最好只创建一个可以跟踪这些实现的服务(当前有多少可用,也许可以通过getter将它们提供给代码库的其他部分),我们可以注册/取消注册它们使用实现bundle的激活器.

虽然这通常可行,但这(几乎)完全是服务层首先提供的,而对我来说,感觉就像我们正在复制功能.

你怎么看?

Pet*_*ens 12

您的用例是服务注册表的主要OSGi用例之一.服务注册表主要用于需要在非耦合模块之间共享实例的此类应用程序.

使用服务注册表,您将获得:

  1. 声明服务或蓝图等工具允许您不与OSGi API耦合
  2. 三项赛
  3. 内省
  4. 并发
  5. 任何模块都可以为池做出贡献而无需中央配置更改
  6. 具有强大过滤器的可选性(可通过DS配置运行时)
  7. 现有shell的可调试性
  8. 标准化

OSGi的主要目的始终是为其他人提供服务的独立模块,例如黑板编程模型.这提供了非常优雅的点对点解耦编程模型.整个班级装载战争总是掩盖了这方面.


Rob*_*bin 5

这将是复制功能.您管理其他服务的服务将成为服务注册表.

您现在拥有依赖于您的数据提供程序的任何服务,这些服务也依赖于您的服务管理器,并且只有这样他们才能进行查找以获得他们想要的实际服务.

最好只是将实际需要的依赖项注入到实际需要它的代码中,并且有许多工具(DS,Spring DM,Blueprint ...)将根据规范中定义的功能提供此功能.也就是服务注册表.

更新:如果您正在进行动态加载,正如您所暗示的那样,OSGi已经为此提供了ServiceListener,消费者需要了解这种性质并进行适当编码.上述工具也处理这些情况.