2016-07-11 15 views
0

ich ein Domain-Objekt habe:Scala, Rahmen spielen: Wie richtig injizieren Abhängigkeit in Domäne (Einheit) Klasse

case class User(val id: Long, username: String) 

Ich will nicht Service-Repository-Ansatz (wie typische Federanwendungen folgen, wo Entitäten sind nur Datenhalter), ich möchte die Funktionalität für den Benutzer in das Benutzerobjekt einfügen.

Aber ich möchte Benutzerobjekt nicht an konkrete Infrastrukturimplementierungen binden, also möchte ich stattdessen Schnittstellen (Traits) übergeben.

Ich versuche, dies zu tun durch folgende:

case class User(val id: Long, val username: String, implicit val userRepository: IUserRepository) 

Und irgendwo in der Anwendung (Controller, oder irgendwo anders), möchte ich (mit @Inject()) konkrete Umsetzung von IUserRepsoitory injizieren und wollen Es wird implizit an den Konstruktor von User übergeben.

Frage 1: Fall class User (val id: Lang, val username: String, implizite val UserRepository: IUserRepository) - das funktioniert nicht, es ist nicht

Frage 2 zusammengestellt: Ist es korrekt, die Infrastrukturimplementierung von der Objektdomäne im Spiel zu entkoppeln? sind sie einige Best Practices?

Danke.

+2

Das ist subjektiv, aber für Q2 würde ich generell "nein" sagen, das Domain-Objekt sollte nicht wissen, wie die Anwendung es verwaltet, je nach Kontext. – cchantep

+0

Was meinst du? Ist es eine schlechte Übung, wenn der Benutzer (Domänenobjekt) mit der Repository-Schnittstelle interagiert? (nicht Umsetzung) – Teimuraz

+0

Für mich ja, das ist ein schlechter – cchantep

Antwort

1

Eine vollständige Parameterliste ist entweder implizit oder nicht. Sie suchen nach

case class User(id: Long, username: String)(implicit userRepository: IUserRepository) 

Architektonisch klingt es wie eine schlechte Idee, eine Benutzerklasse wissen zu lassen, dass es ein eigenes Repository ist.

+0

Ok, nennen wir es UserDao. Ich möchte so etwas tun: user-> activate(), aber nicht wie: user-> status = "active"; userService-> update (Benutzer); Beide interagieren mit Repository (DAO) -Schnittstellen. Was ist im ersten Fall schlecht? – Teimuraz