2014-02-13 45 views
3

這裏下面是一個Play應用程序的常規項目佈局:用蛋糕圖案時如何構建一個遊戲項目

myProject 
    + app 
     + controllers 
     + models 
     + views 

我想controllersmodelsviews內容很清楚,我們中的大多數。現在假設我們需要用蛋糕圖案來實現DAO服務:

DaoServiceComponent.scala

trait DaoServiceComponent[A] { 

    def daoService: DaoService 

    trait DaoService { 

    def insert(entity: A): Future[A] 
    def find(id: Id): Future[Option[A]] 
    ... 
    } 
} 

trait DefaultDaoServiceComponent[A] extends DaoServiceComponent[A] { 
    this: DaoComponent[A] => 

    def daoService = new DaoService { 

    def insert(entity: A) = dao.insert(entity) 
    def find(id: Id) = dao.find(id) 
    ... 
    } 
} 

DaoComponent.scala

trait DaoComponent[A] { 

    def dao: Dao 

    trait Dao { 

    def insert(entity: A): Future[A] 
    def find(id: Id): Future[Option[A]] 
    ... 
    } 
} 

UserDaoComponent.scala

trait UserDaoComponent extends DaoComponent[User] { 

    protected val collection: JSONCollection 

    def dao = new Dao { 

    def insert(entity: User): Future[User] = { 
     ... 
    } 

    def find(id: Id): Future[Option[User]] = { 
     ... 
    } 
    } 
} 

最後,我們在我們的控制器對象連線了一切如常:

object Users extends Controller { 

    private val userService: DaoServiceComponent[User]#DaoService = 
    new DefaultDaoServiceComponent[User] 
    with UserDaoComponent { 
     val collection = db.collection[JSONCollection]("users") 
    }.daoService 

    def create = Action.async(parse.json) { implicit request => 
    request.body.validate[User].fold(
     valid = { user => 
     userService.insert().. 
    ... 
    } 
} 

現在回到我們的項目佈局,我們應該在哪裏放DaoServiceComponentDaoComponentUserDaoComponent,和任何其他支持類?這些文件是否應該放在services目錄中?

myProject 
    + app 
     + controllers 
     + models 
     + services 
      + DaoComponent.scala 
      + DaoException.scala 
      + DaoServiceComponent.scala 
      + EmailServiceComponent.scala 
      + RichEmailComponent.scala 
      + ServiceException.scala 
      + UserDaoComponent.scala 
      + ... 
     + views 

回答

0

我們的項目很可能不是蛋糕模式的示範性實施方案,因爲它本來是沒有使用任何依賴注入,所以藉此與一粒鹽

我們的DAO是一個Ruby應用程序在模型圖層/文件夾中 - User.scala包含一個用戶案例類和一個Users [用戶]。

在服務層/文件夾中的性狀緊密耦合到模型層 - 我們不注入的DAO。

服務性狀被注入到使用蛋糕圖案的控制器。每個控制器都有一個服務,例如我們有一個StreamsController和一個StreamsService。

我們有大約十二控制器/服務和大約八十的DAO(每個MySQL表一個)。

我們有幾個實用工具類,比如Redis的客戶端游泳池和一個HTML模板渲染 - 這是在模型層下方的公共文件夾,因爲少數是在DAO中使用。我們在服務層中有一個Apps trait,其中包含對這些類的抽象val,並且所有服務都通過self包含Apps:Apps =>。控制層然後負責實施和注入應用程序。