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