考虑这种情况DS组成:的相关性选择了使用配置属性
- 在一个网络管理系统,这是完全的OSGi基于并具有严重的就业服务层SOA概念,它决定将NE管理模块DS部件。
- 有一个DS组件用于跟踪网络资源的配置子代理,当时间合适时,它会根据Neil's article通过出厂配置将管理组件配置为关注该资源。
- 组件集未知,但其配置工厂PID由安装管理组件的专用软件包发布。
- 让我们说有一些当中这些管理组件静态,不愿和强制性的依赖,例如
C2
需要C1
。由于NMS需要添加许多资源,因此可能有许多C1
和C2
的实例。因此,C2
必须绑定到其匹配C1
。 - 此选择的标准是一个关键,例如
resource-key
,它由配置代理为每个资源生成,并通过其(工厂)配置属性提供给每个组件。
现在,这里是我的问题:
问:由于配置属性是唯一部件的激活后可用,怎么能C2
绑定到前一个正确的C1
被激活,因为他们的关系的本质是什么?
我知道这个问题有不同的口味,有一些机智的答案,如Dynamic target queries in OSGi with DS和here。但是,所有这些答案中缺少的是这样一个事实,即有些情况下组件的每个实例的动态配置都不是已知的,或者至少在它被激活之前是不知道的。
建议: 因为我们必须解决这个问题,只有优雅和OSGi的可接受答案,我能想到的是介绍在参考绑定时间允许这样的事情对于动态宏扩展C2
:
@Reference(target="(resource-key=${resource-key})")
protected void bindC1(C1 c1)
{
// some binding code
}
我们选择了坚持春分DS暂且(!是的,我知道的),因此,我已经修补了IR SCR现在C2
会结合的C1
适当情况下与resource-key
财产“通过使用C2
扩大${resource-key-value}
S”自己的一套配置匹配的C2
。该值在C2.bindC1()
内尚未(可)访问。
我想知道为什么这样一个方便的设施从我测试过的每个SCR中都没有。我在这里展示的内容很可能会扩展到使用各种来源,而不仅仅是组件的配置属性。但为什么至少没有证据表明此类功能的正式提案?请赐教!
显然是因为解耦;我们(配置者代理)不想强制组件如何选择它们的依赖关系。他们可以根据自己的意愿自由选择他们的“目标”。这是我们希望组件具有的另一种灵活性。为他们提供'目标'限制他们的发展。 –
此外,配置代理不需要知道组件的所有细节,据推测C2'需要'C1'。它只是为他们提供了一个非常基本但重要的配置,以便他们可以绑定他们的依赖并变得活跃。 –
我的意思是,在你的例子中,你正在设置资源密钥属性,它的值选择一些C1服务到C2的配置中。如果你可以做到这一点,你也可以轻松地将其值选择一些C1服务的C1.target属性设置为C2的配置。除了不需要发明一些宏代替语言之外,没有实际的区别。 –