2014-05-15 3 views
1

현재 내가 좋아하는 컨트롤러의 내부에 내 UserService를 wireup하는 guice을 사용하고 있습니다 :게임 내 케이크 패턴을 사용하여 UserService를 설정하는 방법은 무엇입니까?

abstract class UserService { 
    def get(userId: Int): User 
} 

class UserServiceImpl @Inject()(val userDao: UserDao) extends UserService { 
    def get(userId: Int): User = { 
    // .... 
    } 
} 

내가 종속성으로 guice을 삭제하고 케이크를 사용하고자하는 경우 :

@Singleton 
class UserController @Inject()(userService: UserService) extends Controller { 
    def show(userId: Int) { 
     val user = userService.get(userId) 
     Ok("hello " + user.name) 
    } 
} 

내 UserService는 같다 패턴, 코드의 모양은 무엇이며 어떻게 이것을 Play에 통합하여 컨트롤러에서이 서비스를 사용할 수 있습니까?

답변

0

다음은이 모든 것을 구성하는 방법에 대한 아이디어를 제공하는 패키지 이름을 제안합니다.

package controllers.users 

trait UserController extends Controller { 
    this: UserService => 

    def show(userId: Int) = { 
     val user = this.get(userId) 
     Ok("hello " + user.name) 
    } 
} 

package services.users 

trait UserService { 
    def get(userId: Int): User 
} 

package services.users.impl 

trait UserServiceImpl extends UserService { 
    def get(userId: Int) = { /*implementation*/ } 
} 

package controllers 

object UserController extends UserController with UserServiceImpl 

당신은 어디에서든지 당신이 프로젝트에 같은 서비스 및 컨트롤러 trait의를 넣을 수 있습니다. 가장 편리한 라우팅을 위해 컨트롤러 objectcontrollers 패키지에 직접 넣어야합니다.

+0

이 구문/개념의 이름은 무엇입니까?'''this : UserService =>''' – Blankman

+0

이것이 맞는지 확실하지 않습니다. UserService 특성과 UserServiceImpl 특성 사이에 링크가 없습니다. 맞습니까? – Blankman

+0

이 구문의 이름은 '자체 형식'입니다. 당신 말이 맞아, Impl은 물론 인터페이스를 확장해야한다 (나는 나의 대답을 편집했다). – DCKing