我一直在尝试在 Karaf 上使用 OSGi 声明式服务(以及其他东西,例如蓝图)的一些示例。我现在要解决的问题是如何在运行时获取对某些服务的引用(因此注释和/或 XML 在这里并不是一个真正的选择)
我将解释我的用例:
我正在尝试设计(到目前为止只是在我的脑海中,这就是为什么我仍然只尝试使用 OSGi :))一个系统来控制工业中的某些自动化过程。为了与设备通信,使用了一组特殊的协议。为了使组件尽可能可重用,我设计了一个基于层的通信模型(例如用于网络的 ISO/OSI 模型,但要简单得多)
要将其转换为 OSGi,我的系统的每一层都将由一组捆绑包组成。一个用于该层的接口,然后一个插件用于该层的每个实现(将其想象为 OSI 传输层上的 TCP 与 UDP)。
要引用此类网络中的任何设备,将使用自定义地址格式(此类地址的两个示例可以是 xpa://12.5/03FE 或 xpb://12.5/03FE)。这样的地址包含访问所请求设备所需的有关层及其值的所有信息。你可以猜到,这个地址的每一部分都代表了我网络模型的一层。
这些地址将存储在一些配置数据库中(因此,简单的 .cfg 或 .properties 文件也不是一个选项),以便可以在运行时远程更改它们。
我正在考虑创建一个工厂,它将解析这个地址,并根据它的所有组件,创建一个对象链(从 OSGi 获取适当的服务),实现所有层并相应地配置它们。
由于单个层可以有更多的实现(因此,实现单个接口的更多服务),这个工厂需要在运行时(当它获取作为字符串传递的设备地址时)决定选择哪个特定的实现(根据服务将声明的其他属性)。
这如何在 OSGi 中实现?什么方法更适合这个,DS、蓝图或其他方法?