如何在使用蛋糕图案时构建Play项目

时间:2014-02-13 20:32:32

标签: scala playframework projects-and-solutions

以下是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

1 个答案:

答案 0 :(得分:0)

我们的项目可能不是Cake模式的示例性实现,因为它最初是一个没有使用任何依赖注入的Ruby应用程序,所以带上一粒盐

我们的DAO位于模型层/文件夹中 - User.scala包含用户案例类和用户Slick表[用户]。

服务层/文件夹中的特征与模型层紧密耦合 - 我们不注入DAO。

使用Cake模式将服务特征注入控制器。我们每个控制器有一个服务,例如我们有一个StreamsController和一个StreamsService。

我们有大约12个控制器/服务和大约80个DAO(每个MySql表一个)。

我们有几个实用程序类,例如Redis客户端池和HTML模板渲染器 - 它们位于模型层下面的Common文件夹中,因为在DAO中使用了一些。我们在服务层中有一个应用程序特征,它包含这些类的抽象val,所有服务都包含自我的应用程序:Apps => 。然后,控制器层有责任实施和注入应用程序。