0

当您在运行时之前不知道要请求的服务的属性时,获取服务的正确方法是什么,如果可能的话,希望使用声明式服务?

该用例类似于有 3 个提供服务版本 1.0、2.0 和 3.0 的捆绑包,但直到用户在 UI 中选择一个之后才知道将使用哪一个。如果用户选择 2.0,消费者将使用 bundle 2.0 中的东西

我们正在使用 BND 注释,所以带有它们的东西会是理想的,但我有一种感觉,我们需要直接使用 OSGi API,而不是使用注释或声明性服务注入。

最后,如果它是相关的,这更多的是获得资源的不同版本(XML 模式),而不是不同的行为/实现。这个想法是服务将提供其内部资源,每个版本都会有所不同,即使服务本身的代码是相同的

4

2 回答 2

1

声明式服务规范的声明式模型是构建时模型,而不是运行时模型。要进行运行时依赖管理,您要么需要自己使用 ServiceTracker,要么使用不同的依赖管理解决方案。

作为其作者之一,我偏爱 Apache Felix 依赖管理器 [1],它允许您在 Java 代码中“声明”依赖关系(在运行时,例如基于用户在 UI 中做出的选择,例如你说)。它不使用 Bnd 注释,但代码仍然允许您使用声明式样式并提供注入和/或回调等功能。

另一个允许这样做的解决方案是 Apache Felix iPOJO [2]。

[1] http://felix.apache.org/documentation/subprojects/apache-felix-dependency-manager.html

[2] http://felix.apache.org/documentation/subprojects/apache-felix-ipojo.html

于 2014-03-17T19:44:39.003 回答
1

我以前在类似的系统中工作过,我们有自己的“路由”系统。基本上,当您注册服务时,会在元数据中添加版本号。然后在这个路由机制中选择正确的服务。您的服务将需要实现一个通用接口,并在路由器中注入List其中一个。

于 2014-03-17T22:15:50.727 回答