使用依赖注入播放2.5 scala导入类

时间:2016-06-12 09:07:37

标签: scala object import playframework dependency-injection

我有一个带有依赖注入的 Api 类,其中有一个使用此注入的函数:

class Api @Inject()(userRepo: UserRepo) extends Controller {
  def user(email: String) ={
    userRepo.getUser(email).map( .... )
  }
}

同一个软件包中的对象 FlashSession - 我在很多其他文件中使用它。 我想在我的obj FlashSession 中使用用户功能。

object FlashSession { 
  def test = ... Api.user("test@gmail.com") .... 
}

但是我无法导入 Api 类,因为它是一个类而不是一个对象,我不能把这个函数放到compagnon对象中,因为它需要DI。

处理它的最佳方法是什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在Api

中创建此FlashSession课程
object FlashSession {
   def test = new Api(new UserRepo()).user(...)
}

object FlashSession {
   def test(userRepo: UserRepo) = new Api(userRepo).user(...)
}

但这可能不是你真正想要的。不应将全局伴随对象与DI一起使用,尤其是对于数据库数据操作。

答案 1 :(得分:1)

您不能使用Api.user(“email”),因为Api是一个类而不是一个对象。在java中,它喜欢从静态方法调用非静态方法。从理论上讲,你可以有超过1个Api实例,甚至没有Api实例。因此,在对象FlashSession中使用类Api是没有意义的。

如果将Flash更改为类并注入Api类,它将更好用:

class FlashSession @Inject()(api: Api) { 
  def test = ... api.user("test@gmail.com") .... 
}

然后,您需要将FlashSession注入到使用它的所有类中。

您可能会发现新开发人员会将所有内容都设为对象,因为它最简单,而不是任何DI(依赖注入)。为了允许使用诸如模拟之类的东西进行更有效的测试,它们将演变为使用DI。但是,将类与DI混合和匹配,以及对象效果不佳。