2014-02-13 39 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 =>。控制层然后负责实施和注入应用程序。