在我的一个实现库中,我想知道来自哪个用户库请求?
捆绑A. ClientCode - > ServiceInterface
捆绑B. ClientCode - > serviceInterface等
捆绑C. serviceInterface等 ServiceImpl。
这些接口由impl解决。捆绑(捆绑C)。在该捆绑包内,我想知道哪个捆绑请求来自(A或B)?
感谢。
答案 0 :(得分:2)
您可以为接口方法添加BundleContext
的参数。然后,当客户端代码调用您的服务时,传入其bundle上下文,您可以调用context.getBundle().getSymbolicName()
或其他方法来获取有关调用来自的bundle的信息。
答案 1 :(得分:1)
正确的方法是使用ServiceFactory,如OSGi规范中所述。如果您将服务注册为服务工厂,则可以为每个“客户端”提供实现(其中“客户端”定义为捆绑包,调用您的服务)。这允许您知道谁在调用您,而客户端不必指定任何内容,因为添加名为BundleContext的参数显然不是好设计(除非没有其他方法)。
一些“伪”代码:
class Bundle_C_Activator implements BundleActivator {
public void start(BundleContext c) {
c.registerService(ServiceInterface.class.getName(),
new ServiceFactory() {
Object getService(Bundle b, ServiceRegistration r) {
return new ServiceImpl(b); // <- here you hold on to the invoking bundle
}
public void ungetService(Bundle b, ServiceRegistration r, Object s) {}
}, null);
}
}
class ServiceImpl implements ServiceInterface {
ServiceImpl(Bundle b) {
this.b = b; // <- so we know who is invoking us later
}
// proceed here with the implementation...
}