2

我来自春天背景,我们Dependency Injections在项目中使用。现在我开始了Play-Framework,我选择 Scala 进行开发。对于 Scala,我想使用依赖注入,我发现有很多Dependency Injections框架可用于 Scala。Spring 还提供了对 Scala 依赖注入框架的支持。但是我只需要IOC容器,所以不需要使用spring。在Play-Framework文档中,他们使用 Google-Guice 进行依赖注入框架。但我还发现了SCALDI一个不错的 Scala 依赖注入框架。

我仍然很困惑哪些Dependency Injection框架适用于ScalaPlay-Framework. 还有编译时类型的安全框架可用。请建议我,选择哪个Dependency Injection框架?

4

2 回答 2

2

我肯定会建议scaldi,但我也是它的创造者,所以我的意见很可能有点偏颇:D

但说真的,很难给出比你的描述更好的建议。我认为这取决于您正在从事的项目和与您合作的团队。此外,您是否准备放弃一些灵活性来支持静态类型(在这种情况下,蛋糕模式或 MacWire 将是一个不错的选择)。由于您来自 Spring 背景,我认为 scaldi 介绍的概念对您来说很熟悉。

您还需要记住,下一个版本的 Play (2.4.0) 将支持开箱即用的 DI。Google Guice 将是默认实现(因为他们需要一些同时支持 Scala 和 Java 的库),但他们保持开放,因此其他人很容易提供替代方案。很长一段时间以来,我一直致力于支持新的 Play DI 机制的 scaldi,因此理想情况下,它将在 Play 2.4.0 发布时提供,以提供一流的 Scaldi - Play 2.4.0 集成。

但总的来说,我建议您尝试几个库,看看您最喜欢(感觉更舒服)哪个(我建议使用 scaldi、MacWire 和 cake pattern)。

最近在 scaldi 邮件列表中提出了类似的问题。也许你也会发现我的回答很有帮助:

https://groups.google.com/forum/#!topic/scaldi/TYU36h7kGqk

于 2015-04-11T21:47:51.770 回答
2

如果您需要一些非常简单和轻量级的东西,请查看 Macwire:https ://github.com/adamw/macwire

示例用法:

class DatabaseAccess()
class SecurityFilter()
class UserFinder(databaseAccess: DatabaseAccess, securityFilter: SecurityFilter)
class UserStatusReader(userFinder: UserFinder)

trait UserModule {
    import com.softwaremill.macwire._

    lazy val theDatabaseAccess   = wire[DatabaseAccess]
    lazy val theSecurityFilter   = wire[SecurityFilter]
    lazy val theUserFinder       = wire[UserFinder]
    lazy val theUserStatusReader = wire[UserStatusReader]
} 

会产生

trait UserModule {
    lazy val theDatabaseAccess   = new DatabaseAccess()
    lazy val theSecurityFilter   = new SecurityFilter()
    lazy val theUserFinder       = new UserFinder(theDatabaseAccess, theSecurityFilter)
    lazy val theUserStatusReader = new UserStatusReader(theUserFinder)
}

对于测试,只需扩展基本模块并使用模拟/存根等覆盖任何依赖项,例如:

trait UserModuleForTests extends UserModule {
    override lazy val theDatabaseAccess = mockDatabaseAccess
    override lazy val theSecurityFilter = mockSecurityFilter
}
于 2015-04-11T18:12:00.707 回答