我在理解依赖注入的基本思想方面有点麻烦。 (我使用Play 2.5的play-slick模块)假设我有一个需要数据库连接的类Users
。如果仍然需要传递参数,依赖注入的意义何在?
package models
@Singleton
class Users @Inject() (dbConfigProvider: DatabaseConfigProvider) {
private val db = dbConfigProvider.get[JdbcProfile].db
private val users = TableQuery[UserTable]
private val setupAction = DBIO.seq(users.schema.create)
private val setupFuture: Future[Unit] = db.run(setupAction)
def getAll(): Future[Seq[User]] = setupFuture.flatMap(_ =>
db.run(users.result)
)
// More methods like the previous
}
当我有需要访问这些方法的看法,我希望依赖注入系统填写dbConfigProvider
依赖对我来说,是这样的。
package views
class UserSearch {
def index(implicit ec: ExecutionContext): Future[String] = Future(
(new Users).getAll().map(seq => seq.map(user => user.name).mkString(" "))
)
}
但是这给了我一个编译错误,我被迫做出dbConfigProvider
我的观点的依赖,并明确地传递进去。在这种情况下,我最终从调用视图的控制器获取dbConfigProvider
。
package views
class UserSearch @Inject (dbConfigProvider: DatabaseConfigProvider) {
def index(implicit ec: ExecutionContext): Future[String] = Future(
(new Users(dbConfigProvider)).getAll().map(seq =>
seq.map(user => user.name).mkString(" "))
)
}
我假设我误解了依赖注入应该如何工作。
所以我的问题如下:
什么在我的模型
Users
使用@Inject()
关键字,然后点?我的设计模式有瑕疵吗?我很乐意将
Users
和UserSearch
作为对象,但之后我无法在它们上使用依赖注入。如果有人对Slick很熟悉,那么我的
getAll()
方法是否适用于光滑?这甚至是编写异步代码的正确方法吗?
'UserSearch'应该注入'Users',而不是'Users'需要的'DatabaseConfigProvider'。没有理由'UserSearch'需要知道这一点。 –
@MichaelZajac谢谢,但是我会每次在控制器的Action方法中创建'new Users'的实例吗? – rusins
不,DI框架应该为您创建所有的依赖关系。如果你需要在你的控制器中使用'Users',它应该被注入你的控制器。 –