Ho iniziato ad imparare scala per un po 'ora e ora guardando il modello di torta. Ho avuto l'esempio dalla hereimportanza del modello di torta in scala
trait UserRepositoryComponent {
def userLocator: UserLocator
trait UserLocator {
def findAll: List[User]
}
}
trait UserRepositoryJPAComponent extends UserRepositoryComponent {
val em: EntityManager
def userLocator = new UserLocatorJPA(em)
class UserLocatorJPA(val em: EntityManager) extends UserLocator {
def findAll = {
println("Executing a JPA query")
List(new User, new User)
}
}
}
trait UserServiceComponent {
def userService: UserService
trait UserService {
def findAll: List[User]
}
}
trait DefaultUserServiceComponent extends UserServiceComponent {
this: UserRepositoryComponent =>
def userService = new DefaultUserService
class DefaultUserService extends UserService {
def findAll = userLocator.findAll
}
}
A me sembra che troppi codice standard per ottenere il repository APP iniettato al servizio.
Tuttavia questo codice farebbe lo stesso con molto minore numero di linee
trait UserRepository {
def findAll
}
trait JPAUserRepository extends UserRepository {
val em: EntityManager
def findAll = {
em.createQuery
println("find using JPA")
}
}
trait MyService {
def findAll
}
trait MyDefaultService extends MyService {
this: UserRepository=>
}
Istanziare entrambi gli scenari.
val t1 = new DefaultUserServiceComponent with UserRepositoryJPAComponent {
val em = new EntityManager()
}
t1.userService.findAll
val t2 = new MyDefaultService with JPAUserRepository {
val em = new EntityManager
}
t2.findAll
Secondo scenario utilizza molto meno codice e utilizza DI. Puoi aiutarmi a capire quali sono i vantaggi extra del modello di torta.
Come dice @Archeg, il tuo secondo esempio è anche una variante del modello di torta. –