我的Play应用程序(Play 2.4.3)中的Slick配置存在问题。 我读了documentation article但想要将dbConfig从控制器移到指定的trait并将这个特性混合到存储库类。
项目中有几个文件:ClientRepository(class),BaseClientRepository(trait)和BaseDbRepository(trait)。
trait BaseDbRepository {
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
import dbConfig.driver.api._
def withConnection[T](f: => DBIOAction[T, NoStream, Nothing]) = {
dbConfig.db.run(f)
}
}
trait BaseClientRepository {
def getById(id: Int): Future[Client]
def getByLocation(location: String): Future[Seq[Client]]
}
class ClientRepository extends BaseDbRepository with BaseClientRepository {
def getById: Future[Client] = withConnection {
...
}
def getByLocation: Future[Seq[Client]] = withConnection {
...
}
}
这适用于我的客户端控制器:
class Client extends Controller {
def getById(id: Int) = ???
}
但是当我尝试将DI与Guice一起使用时:
class Client @Inject()(clientRepository: BaseClientRepository) extends Controller {
def getById(id: Int) = Action.async {
// I try to use client repository here
}
}
它会因以下异常而失败 CreationException:无法创建注入器,请参阅以下错误:
1)捕获并报告了异常。消息:没有启动的应用程序 在com.google.inject.util.Modules $ OverrideModule.configure(Modules.java:177)
我尝试将此定义val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
移动到Global.scala中,它只是起作用,但我现在已经弃用了Global.scala。
那么,最适合它的地方在哪里?
更新:我使用注入模块进行DI配置:
class InjectionModule extends AbstractModule {
def configure() {
bind(classOf[BaseClientRepository]).toInstance(new ClientRepository)
}
}
答案 0 :(得分:1)
private lazy val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
答案 1 :(得分:0)
Guice无法注入BaseClientRepository的实现,注释@ImplementedBy可以提供帮助。
var $frag = $(document.createDocumentFragment());
$frag.data('foo', {'bar': 'baz'});
$('div').text($.type($frag.data('foo'))); // returns undefined.