2

我从游戏中2.3迁移到2.5如何玩依赖注入数据库2.5

原来我有“DAOFactory”对象

object DAOFactory { 
    def categoryDAO: CategoryDAO = AnormCategoryDAO 

    def itemDAO: ItemDAO = AnormItemDAO 

    def bidDAO: BidDAO = AnormBidDAO 

    def userDAO: UserDAO = AnormUserDAO 

    def feedStatsDAO: FeedStatsDAO = AnormFeedStatsDAO 
} 

,让我们以“AnormCategoryDAO”作为一个例子,我必须改变“对象”到“类”

object AnormCategoryDAO extends CategoryDAO { 
    val category = { 
    int("id") ~ str("display_name") ~ str("url_name") map { 
     case id~displayName~urlName => Category(id, displayName, urlName) 
    } 
    } 

    def create(displayName: String, urlName: String) = DB.withConnection { implicit c => 
    SQL("INSERT INTO category(display_name, url_name) VALUES({displayName}, {urlName})").on(
     'displayName -> displayName, 'urlName -> urlName).executeUpdate() 
    } 

    def findById(id: Int): Option[Category] = DB.withConnection { implicit c => 
    SQL("SELECT * FROM category WHERE id = {id}").on('id -> id).as(category singleOpt) 
    } 

    def findByName(urlName: String): Option[Category] = DB.withConnection { implicit c => 
    SQL("SELECT * FROM category WHERE url_name = {urlName}").on('urlName -> urlName).as(category singleOpt) 
    } 

    def all(): List[Category] = DB.withConnection { implicit c => 
    SQL("SELECT * FROM category ORDER BY display_name").as(category *) 
    } 
} 

因此,我改变的对象CLASS和如下面SINGLETON注释,并且我改变“dB.withConnection”到“db.withConnection”

@Singleton 
class AnormCategoryDAO @Inject()(db: Database) extends CategoryDAO { 
    val category = { 
    int("id") ~ str("display_name") ~ str("url_name") map { 
     case id~displayName~urlName => Category(id, displayName, urlName) 
    } 
    } 

... 

现在,“AnormCategoryDAO”是一个类。所以我需要找出一种方法来用默认数据库实例化它。 但我不知道如何实例化它。

object DAOFactory { 
    //def categoryDAO: CategoryDAO = AnormCategoryDAO 

    def userDAO: UserDAO = AnormUserDAO 

    def itemDAO: ItemDAO = AnormItemDAO 
} 

问题是,我该如何注入数据库并实例化它?

回答

0

我不喜欢使用guice或类似的di。与编译时迪,我可以做到这一点通过使用类似:

import play.api.db.slick.{DbName, SlickComponents} 

trait TablesComponents extends BaseComponent with SlickComponents { 

    lazy val dbConf = api.dbConfig[JdbcProfile](DbName("default")) 

    lazy val myTable = new MyTable(dbConf.db) 
    lazy val otherTable = new OtherTable(dbConf.db) 
} 
0

你要么有依赖性是被注入准备好了,在这种情况下,你可以直接打电话new AnormCategoryDAO(myDb),或任何需要的地方你注入AnormCategoryDAO (这可能意味着依赖注入一直传播到由Play实例化的控制器)。

例如:

class CategoryService @Inject() (categoryDao: CategoryDAO) { 
    def findAll() = categoryDao.findAll() 
} 

注意,在这个例子中,我使用的抽象类型CategoryDAO来指代categoryDAO。为此,你必须告诉依赖注入框架(通常是Guice),它应该注入哪些类(绑定)。或者,您可以直接依赖AnormCategoryDAO

如何定义自定义绑定记录在这里:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection

注意,有依赖注入名为编译时的另一种方法:https://www.playframework.com/documentation/2.5.x/ScalaCompileTimeDependencyInjection

+0

我读了这个文档,你从我身边走过,但我不能”现在我正在阅读guice文档,我想我有点理解。在我读完这篇文章之后,我再来发表评论,谢谢 – Augusto

+0

@Augusto如果你不熟悉依赖注入,我建议你从guice的创建者那里谈谈:https://www.youtube.com/看?v = FFXhXZnmEQM – rethab

+0

但我理解这个问题。我从playframework开始了DI项目,了解并了解如何组装。 https://github.com/playframework/play-scala-compile-di-with-tests – Augusto