在我们的OSGi
系统设计中,我们有一个重复的场景,其中一个服务想要对已部署服务的子集应用一些特定的处理(“处理”)。在简单的情况下,我们会让目标服务分配一些服务属性以指示他们想要特殊处理,然后让处理服务找到它们的白板样式。
但是,当决定哪些服务子集作为目标的算法需要用Java
逻辑实现并且不容易用包本身设置的静态属性表示时,如何最好地设计呢?
此外,如果我们有多个处理服务想要重用相同的服务目标,理想情况下,选择算法应该在其自己的服务中实现。我们称之为SelectService
,并说它具有动态识别“abc”和“xyz”类别服务的逻辑。
我可以想到这些主要的替代方案来解决这个问题,也许还有更多?
让我们
SelectService
检查部署的服务,然后在适用时以某种方式(如何?)在它们上设置属性“abc”和“xyz”。然后治疗服务可以使用ServiceTracker
带有属性过滤器的标准来找到他们想要的服务。让
SelectService
提供方法getAbcServices()
并getXyzServices()
返回一些ServiceTracker
类似的对象。治疗服务可以调用这些方法来寻找目标服务。让处理服务在服务注册表中声明一些东西(服务接口或服务属性)来表达对服务选择的兴趣。
SelectService
然后找到这些愿望白板样式并通知治疗服务有关选择。这是在系统中思考的错误方式
OSGi
,您甚至不应该这样做:-)
编辑1:
总结一下这个场景,你可以说它类似于声明式服务或蓝图等扩展服务:
targeted <--> extender
service service
此外,扩展器服务分为两部分/层,以便重用选择逻辑:
targeted extender extender
service <--> service <--> service
treatment ** selection
logic logic
有趣的部分是处理和选择逻辑之间的 API (**),因为它提到了其他服务,并且还需要一些添加/删除事件机制。为了便于理解,还希望尽可能多地使用标准 OSGi 模式和支持功能。
[Meta:将讨论划分为一个答案线程(答案+评论)可能会更好吗?]