在我将应用程序从2.4迁移到2.5(并删除所有静态引用)的过程中,我完成了以下操作:
class Generic @Inject()(implicit val mat: Materializer, cache: CacheApi, wsClient: WSClient, configuration: play.api.Configuration)
{ ... }
@Singleton
class Concrete1 @Inject() (gw:Generic) { ... }
@Singleton
class Concrete2 @Inject() (gw:Generic) { ... }
要使用它,我会使用Generic实例注入Concrete1 / 2。 它有效,但在网上看到其他几个例子后,它似乎并不正确。
我正在考虑修改它:
abstract class Generic(cache: CacheApi, wsClient: WSClient, configuration: play.api.Configuration)
{ ... }
@Singleton
class Concrete1(cache: CacheApi, wsClient: WSClient, configuration: play.api.Configuration)
extends Generic(cache, wsClient, configuration) { ... }
@Singleton
class Concrete2(cache: CacheApi, wsClient: WSClient, configuration: play.api.Configuration)
extends Generic(cache, wsClient, configuration) { ... }
然后为了能够做到:@Inject() (c1:Concrete1, c2:Concrete2)
我想我需要它们是由https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings定义的模块?
在这里做什么更有意义?
答案 0 :(得分:1)
我实际上不同意你的"看起来不太正确"言。
我认为你的第一个例子更贴切地反映了构成而不是继承哲学已经accepted as a more maintainable way来构建软件。
在不了解您的Concrete
或Generic
课程的情况下,很难说更多,但如果后者继承,我会非常感到惊讶基于结构,更容易正确单元测试,而模拟Generic
并将其注入测试Concrete
类将是微不足道的。
其他好处: