2

Ich bin aus dem Spiel 2,3-2,5 MigrationWie Abhängigkeit Inject Datenbank in Play 2.5

Ursprünglich habe ich „DAOFactory“ Objekt

object DAOFactory { 
    def categoryDAO: CategoryDAO = AnormCategoryDAO 

    def itemDAO: ItemDAO = AnormItemDAO 

    def bidDAO: BidDAO = AnormBidDAO 

    def userDAO: UserDAO = AnormUserDAO 

    def feedStatsDAO: FeedStatsDAO = AnormFeedStatsDAO 
} 

und lassen Sie sich „AnormCategoryDAO“ als Beispiel nehmen, und ich müssen das „Objekt“ ändern in eine „Klasse“

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 *) 
    } 
} 

Also änderte ich das Objekt zu CLASS und kommentierte mit SINGLETON wie unten, und ich änderte „DB.withConnection“ auf „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) 
    } 
    } 

... 

Jetzt ist "AnormCategoryDAO" eine Klasse. Also muss ich herausfinden, wie man es mit einer Standarddatenbank instanziieren kann. Aber ich weiß nicht, wie man es instanziiert.

object DAOFactory { 
    //def categoryDAO: CategoryDAO = AnormCategoryDAO 

    def userDAO: UserDAO = AnormUserDAO 

    def itemDAO: ItemDAO = AnormItemDAO 
} 

Die Frage ist, wie injiziere ich die Datenbank und instanziiere sie?

Antwort

0

Ich mag nicht guice oder ähnlich di verwenden. mit der Kompilierung di kann ich erreichen, dass durch so etwas wie mit:

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

entweder Sie haben die Abhängigkeit, die bereit injiziert werden soll, in welchem ​​Fall Sie new AnormCategoryDAO(myDb) direkt anrufen können, oder Sie die AnormCategoryDAO injizieren, wo immer es erforderlich ist, (Dies könnte bedeuten, dass die Abhängigkeitsinjektion den ganzen Weg zu den Controllern fortschreitet, die von Play instanziiert werden).

Beispiel:

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

Beachten Sie, dass in diesem Beispiel habe ich verwendet, um den abstrakten Typ CategoryDAO zum categoryDAO zu verweisen. Zu diesem Zweck müssen Sie dem Framework für die Abhängigkeitsinjektion (in der Regel Guice) mitteilen, welche Klasse es injizieren soll (binding). Alternativ können Sie sich direkt auf AnormCategoryDAO verlassen.

Wie Sie benutzerdefinierte Bindungen definieren kann, ist hier dokumentiert: https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection

Beachten Sie, dass es ein alternativer Ansatz ist die Injektion genannt Kompilierung Abhängigkeit: https://www.playframework.com/documentation/2.5.x/ScalaCompileTimeDependencyInjection

+0

ich diese Dokumentation gelesen hatte Sie mir vorbei, aber ich couldn‘ Ich verstehe gut, jetzt lese ich die richtige Dokumentation, und ich glaube, ich verstehe ein wenig. Nachdem ich das gelesen habe, komme ich wieder und lass einen Kommentar, danke – Augusto

+0

@Augusto Wenn du nicht vertraut bist mit Abhängigkeitsinjektionen, empfehle ich dieses Gespräch vom Schöpfer von guice: https://www.youtube.com/ beobachten? v = FFXhXZnmEQM – rethab

+0

Noch verstehe ich dieses Thema. Ich habe das DI-Projekt von playframework genommen, um zu verstehen und zusammenzubauen. https://github.com/playframework/play-scala-compile-di-with-tests – Augusto