我正在设计一个应用程序,其功能需要在不同的上下文中相同。请参考下图:
+----+ +----+ +----+ |B1 +--->-----+B2 +-->----+B3 | |ctx1| use |ctx1| use |ctx1| +----+ service +----+service+----+ +-------+ +----+ +----+ +----+ |Context| |B1 +--->-----+B2 +-->----+B3 | |Manager| |ctx2| use |ctx2| use |ctx2| | | +----+ service +----+service+----+ | | : : : +-------+ : : : +----+ +----+ +----+ |B1 +--->-----+B2 +-->----+B3 | |ctxN| use |ctxN| use |ctxN| +----+ service +----+service+----+
有4个捆绑包:
上下文管理器是负责知道新上下文何时可用并实例化新版本 B1 , B2 的捆绑包>和 B3 。 B2 和 B3 提供的服务在上下文中完全相同,只是我想在服务上添加一个属性来区分它在哪个上下文运行(ctx1 vs ctxN for例)。 现在这是我想要实现的理论,我想我可以通过Declarative Services轻松实现它,实际上我做了 B1 * B2 *和 B3 是 ComponentFactory ,方法是在组件标题中指定component.factory属性,然后设置 B1 以引用 B2提供的服务,我也设置 B2 来引用 B3 提供的服务。 这些是我面临的挑战:
此时我正在考虑实际上避免使用声明式服务并让每个上下文包扩展我将提供的基类,它基本上实现类似于org.apache.felicy.dependencymanager的依赖性跟踪,但是这样每个上下文组件的开发人员不必担心知道代码所在的上下文。但是我讨厌恢复这个解决方案,我觉得我只是复制逻辑可能已经存在于OSGi规范中,所以我的问题是:
创建可在OSGi中的每个上下文基础上运行的bundle的最佳方法是什么,这样bundle可以以声明方式描述依赖,而不必明确提及它们所在的上下文跑?
答案 0 :(得分:0)
这里有一些令人困惑的术语。你谈论捆绑B1,B2和B3。你还谈到了实例化B1,B2和B3的新版本。你的意思是更新捆绑包B1,B2和B3?或者你的意思是捆绑B1,B2和B3分别提供服务S1,S2和S3?
答案 1 :(得分:0)
回答我自己的问题。只要我需要一个解决方案,感谢Apache Felix DependencyManager的帮助,我已经替换了Declarative Services,并且对于每个上下文,bundle(下面的源代码中的Container)我创建了一个新的依赖管理器实例,有助于跟踪每个上下文的服务。
有关代码参考,请查看: OpenDayLight ComponentActivatorAbstractBase
为了管理依赖关系并确保它们在同一个上下文中,创建了一个特殊的ServiceDependency,以供参考:OpenDayLight ServiceDependency
例如,关于激活器的实际使用方法,请参阅:OpenDayLight sample activator
希望这对其他人也有用。