【问题标题】:DI or Service Locator : Injecting implementations at run-time ( no static binding ) in scalaDI 或服务定位器:在 scala 中在运行时注入实现(无静态绑定)
【发布时间】:2017-06-28 01:44:11
【问题描述】:

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

过去几天我一直在寻找一个 java/scala DI 框架或库来为我执行以下操作:

  1. 标识类路径上的接口/特征的实现
  2. 在标记的站点上实例化并注入所述实现(重要特性:全部),最好带有注释
  3. 在编译器中不能发生上述情况,因为我需要一个插件架构,在 JVM 启动之前不会引入插件
  4. 因此上述情况可能在 JVM 启动时发生(无需热插拔)

我越来越倾向于 OSGi DS,我是它的忠实粉丝,但由于 #4,我认为它是一种矫枉过正。

我查看了 guice、weld、scaladi 和 macwire,但无法立即找到执行此操作的简单方法。我的目标是让“插件”作者不必以任何方式了解我的注入/IoC 解决方案,除了偶尔的注释(最好是 JSR330)在注入站点我愿意处理更丑陋的事情。 :-)

我是否必须在这里推出自己的解决方案,使用 OSGi,还是我在上述库中遗漏了一些琐碎的东西?

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

【问题讨论】:

标签: scala osgi guice weld macwire


【解决方案1】:

如果你负担得起,最好(不仅对你,而且对整个生态系统)听从 Peter 的建议。

不过,务实地说,Java 有 SPI,它来自 OOTB,在您的特定情况下可能是最简单的方法。

【讨论】:

  • 乍一看,这看起来很完美。我会深入研究它。谢谢!
【解决方案2】:

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

【讨论】:

  • 我不确定我是否理解你的最后一句话,抱歉。我想避免创建绑定,因为,我不知道前面的具体类型。但是现在我正在考虑以某种“容器模块”方式对模块(内部带有静态绑定)进行编程连接可能是我唯一的方法
  • @pghn 这正是我一直在谈论的,在运行时搜索和初始化组件。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2016-01-03
    • 2018-10-27
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多