2016-06-12 5 views
1

ich eine Klasse Api haben mit Dependency Injection, mit einer Funktion, die diese Injektion verwenden:2.5 scala Import-Klasse mit Dependency Injection

class Api @Inject()(userRepo: UserRepo) extends Controller { 
    def user(email: String) ={ 
    userRepo.getUser(email).map(....) 
    } 
} 

Und ein Objekt FlashSession im selben Paket - ich bin Verwenden Sie es in vielen anderen Dateien. Ich möchte die Funktion Benutzer in meinem Obj FlashSession verwenden.

object FlashSession { 
    def test = ... Api.user("[email protected]") .... 
} 

Aber ich kann die Api Klasse nicht importiert werden, weil es sich um eine Klasse und nicht ein Objekt ist, und ich kann diese Funktion nicht in das compagnon Objekt setzen, weil es DI braucht.

Was ist der beste Weg, damit umzugehen?

Vielen Dank für Ihre Hilfe!

Antwort

1

Sie können diese Api Klasse in FlashSession

object FlashSession { 
    def test = new Api(new UserRepo()).user(...) 
} 

oder

object FlashSession { 
    def test(userRepo: UserRepo) = new Api(userRepo).user(...) 
} 

erstellen Aber das ist wahrscheinlich nicht das, was Sie wirklich wollen. Sie sollten keine globalen Begleitobjekte mit DI verwenden, insbesondere für die Manipulation von Datenbankdaten.

+1

Danke, aber effektiv ist es nicht genau das, was ich wollte, weil ich die Api-Klasse als Controller verwende. Aber ich kann deine Antwort anpassen und etwas damit machen. Was meinen Sie mit "nicht globale Begleiter Objekte mit DI verwenden"? Es bedeutet, dass Ihre Lösung nicht sehr gut ist, oder? – Lauriane

+0

Ja, die Verwendung von Konstruktor DI erfordert eine gewisse Anpassung des Codes. Sie sollten einfach benötigte Klassen über Konstruktor übergeben und dann globale Objekte verwenden. @ Bruce-Lowe Antwort unten zeigt einen guten Einblick in diesen Ansatz. – liosedhel

1

Sie können Api.user ("email") nicht verwenden, da Api eine Klasse und kein Objekt ist. In Java ist es so, als würde man von einer statischen Methode eine nicht statische Methode aufrufen. Theoretisch könnte man mehr als eine Instanz von Api oder gar keine Api haben. Daher macht es keinen Sinn, die Klasse Api im Objekt FlashSession zu verwenden.

Wenn Sie Flash zu einer Klasse ändern und die Api Klasse injizieren wird es besser funktionieren:

class FlashSession @Inject()(api: Api) { 
    def test = ... api.user("[email protected]") .... 
} 

Sie müssen dann FlashSession in allen Klassen injizieren, die sie verwenden.

Sie werden feststellen, dass neue Entwickler alles zu einem Objekt machen werden, da es am einfachsten ist und keine DI (Abhängigkeitsinjektion). Um ein effektiveres Testen mit Dingen wie Mocks zu ermöglichen, entwickeln sie sich zu DI. Mischen und Anpassen von Klassen mit DI und Objekten funktioniert jedoch nicht gut.

+0

Ich habe diese Frage gestellt, um zu wissen, ob es einen "schönen" Code gibt, den ich erreichen will. Anscheinend nicht ... Also werde ich es wahrscheinlich vergessen und es auf eine andere Art und Weise tun, das schafft kein Chaos. Aber danke für deine Antwort! – Lauriane