OSGi - 相互依赖的捆绑包
Posted
技术标签:
【中文标题】OSGi - 相互依赖的捆绑包【英文标题】:OSGi - Bundles dependant on each other 【发布时间】:2022-01-23 02:47:32 【问题描述】:我有两个捆绑包
1. I18n Service (Internationalization)
2. Persistence Service (Database)
问题是 Bundle I18n
使用数据库服务以不同的语言存储 Texts
和 Messages
。而Persistence Service,也使用I18m
来存储一些不同语言的Error Messages
,所以每个Service相互依赖,但它们不应该一起工作,因为它们都提供不同类型的Service。
我的问题,有谁知道Pattern
或Strictire
可以帮助我解决这个问题吗?我需要注册这些服务并允许它们相互使用。
在 Persistence Service Activator 中,我删除了以下依赖项:
dependencyManager.add(createComponent()
.setImplementation(PersistenceImpl.class)
.add(createServiceDependency()
.setService(I18nService.class)
.setRequired(true))
);
但是I18n
不能这样做,在这种情况下,它们都不会启动:
dependencyManager.add(createComponent()
.setImplementation(I18nImpl.class)
.add(createServiceDependency()
.setService(PersistenceService.class)
.setRequired(true))
);
谢谢。
【问题讨论】:
这能回答你的问题吗? Intra- and inter-bundle mutual dependencies in OSGi component models 请edit您的问题包含有关您的服务如何相互交互的更详细说明。翻译(?)想要将数据存储在某处的“国际化”听起来很奇怪。在这种情况下,让它依赖于数据库服务可能不正确。添加某种图表,您拥有(或想要创建)哪些服务、它们应该做什么、它们之间如何交互以及为什么以具有循环依赖关系的方式设计它们。 @Progman 为什么说“国际化”Bundle 不能对数据库进行事务处理?你知道更好的做法吗?请随时分享您的想法。 这就是为什么我要求澄清您拥有的服务以及您想要构建的服务。还要描述服务之间应该如何交互。 @Progman 很简单,I18n
提供 2 个基本服务:1. 字符串资源的注册和 2. 字符串资源的调度。这一切都存储在数据库中并在运行时加载到内存中。还有Persistence Service
,它为需要它的任何其他模块(包括I18n
)提供数据库服务,并且它还注册了自己的资源字符串(即“字段ABC应该是一个字符串”等)。因此,如您所见,两者都互相利用。
【参考方案1】:
当你几乎总是遇到循环时,你把事情弄得太复杂了。在这种情况下,似乎应该由更高级别的应用程序代码使用的低级别组件做了太多的“应用程序”级别的事情。这使得它们很难重用,并且往往会创建非常复杂的系统。
我的解决方案是从数据库中删除翻译,数据库应该使用错误代码和可能的一些参数报告其错误,但消息的翻译应该在更高级别上完成,更接近用户。这样就无需了解 I18n。
无论如何,这听起来更好,因为在数据库操作级别上,您通常并不真正了解调用者的语言环境,试图在此处普遍获取它需要丑陋的解决方案,例如线程本地或污染调用链。恕我直言,所有代码都需要进行翻译的设计会创建一个由不必要的耦合组成的非常复杂的网络。
我的黄金法则是创建可重用的低级简单组件,每个组件具有很少的依赖关系,然后将它们连接到一个应用程序组件中。这使得应用程序组件依赖于所有东西,但其他组件没有很大的依赖扇出恕我直言。每当我有一个依赖于服务的组件时,我觉得它不是其基本功能的一部分。
【讨论】:
以上是关于OSGi - 相互依赖的捆绑包的主要内容,如果未能解决你的问题,请参考以下文章
使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?