DI或服务定位器:在scala中在运行时注入实现(无静态绑定)

时间:2017-02-09 21:16:31

标签: scala osgi guice weld macwire

我有一个用例,我想提供一个简单的API来扩展我的scala应用程序的功能。

我花了最近几天试图找到一个java / scala DI框架或库来为我做以下事情:

  1. 识别类路径上的接口/特征的实现
  2. 在标记的站点上实例化并注入所述实现(重要特征:所有这些),最好带有注释
  3. 以上内容无法在编译器中发生,因为我需要一个插件架构,在JVM启动之前不会引入插件
  4. 因此,上述情况可能发生在JVM启动时(无需热插拔)
  5. 我越来越倾向于使用OSGi DS,我非常喜欢它,除非我认为它是#4的过度杀伤。

    我看着guice,焊接,scaladi和macwire,并没有立即看到一个简单的方法来做到这一点。我的目标是"插件"作者不必以任何方式了解我的注射/ IoC解决方案,除了偶尔的注释(最好是JSR330)在注射部位,我愿意处理更丑陋的事情。 : - )

    我是否必须在这里推出自己的解决方案,使用OSGi,或者我在上述库中遗漏了一些小事?

    ps:我试图避开OSGi主要是因为它与应用程序框架的交互我使用(akka - 不确定bundle / DS生命周期与单个程序混合良好演员系统)

3 个答案:

答案 0 :(得分:1)

我看看Scaldi目前提供的功能。我发现它已经足够成熟了。所以没有什么难以使用这个DI库来实现你的目标。例如,您只能实现用于在某些配置文件或其他任何内容中进行特定注释/指定搜索的代码。

答案 1 :(得分:1)

如果您喜欢DS(并且它似乎非常适合您的问题)那么为什么不解决Akka的任何问题?我很确定其他人愿意提供帮助,因为它看起来像是一个有趣的组合。

答案 2 :(得分:1)

如果你能负担得起,它可能是最好的(不仅适合你,而是适用于整个生态系统)符合彼得的建议。

从语用上讲,Java有SPI来自OOTB,可能是最简单的方法。