2012-01-09 49 views

回答

3

简答题;第一个问题=否,第二个问题=否,没有“解决方法”

“合同设计”原则发挥作用。基本上我们提供了一个消费者依赖和提供者实现的接口 - 这将我们的消费者代码分解为我们实现者的实现细节。请参阅http://www.osgi.org/blog/2011/08/package-as-contract.html以获得良好的概述,并参阅http://en.wikipedia.org/wiki/Design_by_contract

考虑到我们希望使用的接口(API)和实现(API接口的具体实现)以及消费者(希望使用接口实现的代码),对于OSGi,您有许多选项。

  1. 一个包可以同时提供接口和实现,但如果此服务被捆绑本身
  2. 具有接口(其中出口)一个独立的包和其他的外部使用,必须导出界面(s) - 实现bundle必须导入接口的包,但不需要显示他们自己的实现。

号2的优点包括允许多个提供商(OSGi的使用可被用来指定在注册的服务的属性的元数据匹配的LDAP过滤器),并利用OSGi的的动态结合性质(即可以改变实施运行时提供者)。

需要注意的一点是,使用者和提供者必须使用与包版本和导出包所定义的相同的类(换句话说,加载API类的包类加载器对于消费者而言必须是相同的和提供者)。

1

服务的类型应该在导出的包中。服务是键入的,并建立在模块层的类型共享上。所以你需要确保服务的提供者和服务的使用者都可以共享相同的类型。所以一些bundle必须导出包含该类型的包,以便提供者和消费者可以导入该包。这允许框架验证服务的类型安全性。