私はしばらくの間、スケーラーの学習を始め、現在はケーキパターンを見ています。私はそれがサービスに注入されたJPAリポジトリを取得するにはあまりにも多くの定型コードのように見えるhereスケッチのケーキパターンの重要性
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
}
}
から私に例を得ました。
しかし、このコードでは、両方のシナリオをインスタンス化ライン
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=>
}
のはるかに少ない数と同じことをするだろう。
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
第2のシナリオでは、はるかに少ないコードしか使用せず、DIを使用します。ケーキパターンがもたらした特別なメリットについて理解できますか?
を見ることをお勧めScalaでDIのように、スプリングを使用するには、あなたの第二の例はまた、ケーキのパターンの変形です。 –