2016-06-12 110 views
1

我有一个类阿比与依赖注入,与使用该注入的功能:播放2.5斯卡拉进口类依赖注入

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

而且在同一个包对象FlashSession - 我在很多其他文件中使用它。 我想使用功能用户到我的目标FlashSession

object FlashSession { 
    def test = ... Api.user("[email protected]") .... 
} 

但我不能导入阿比类,因为它是一个类,而不是一个对象,我不能把这个功能到孔帕尼翁对象,因为它需要DI。

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

谢谢你的帮助!

回答

1

你可以在里面FlashSession

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

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

创建这个Api类但这可能不是你真正想要的。您不应将全局伴随对象与DI一起使用,特别是对数据库数据操作。

+1

谢谢,但实际上,这不是我想要的,因为我使用Api类作为控制器。但我可以改变你的答案,并用它做一些事情。 “不使用全局伴随对象与DI”是什么意思?这意味着你的解决方案不是很好,对吗? – Lauriane

+0

是的,使用构造函数DI需要在代码中进行一些修改。您只需通过构造函数传递所需的类,然后使用Global对象。下面的@ bruce-lowe答案显示了这种方法的良好洞察力。 – liosedhel

1

由于Api是一个类而不是对象,所以不能使用Api.user(“email”)。在Java中它就像从静态方法调用一个非静态方法。理论上你可以有一个以上的Api实例,甚至没有Api实例。因此,在对象FlashSession中使用类Api是没有意义的。

如果更改的Flash一类和注入API类,将更好地工作:

class FlashSession @Inject()(api: Api) { 
    def test = ... api.user("[email protected]") .... 
} 

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

您可能会发现新开发人员会将所有对象都设置为最简单的对象,而不是执行任何DI(依赖注入)。为了允许更多有效的模拟测试,他们演变为使用DI。然而,混合和匹配类与DI和对象不能很好地工作。

+0

我问了这个问题,知道是否有一个“美丽”的代码来实现我想要的。显然不是......所以我可能会忘记它,并以另一种方式去做,这并不会造成这样的混乱。 但是,谢谢你的回答! – Lauriane