如何在使用蛋糕模式时构建Play项目

3
以下是Play应用程序的常规项目布局:

myProject
    + app
       + controllers
       + models
       + views

我认为大部分人都清楚 controllers, modelsviews 的内容。现在假设我们需要使用蛋糕模式实现 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

我们的项目可能不是Cake模式的典范实现,因为它最初是一个Ruby应用程序,没有使用任何依赖注入,所以请谨慎对待。

我们的DAO位于模型层/文件夹中 - User.scala包含一个User case类和一个Users Slick Table[User]。

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

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

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

我们有几个实用类,例如Redis客户端池和HTML模板渲染器 - 这些类在模型层下面的Common文件夹中,因为一些类在DAO中使用。我们在服务层中有一个Apps trait,其中包含这些类的抽象值,并且所有服务都通过self : Apps => 包括Apps。然后控制器层有责任实现和注入Apps。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接