我已经开始学习scala一段时间了,现在正在研究蛋糕模式。我从here得到了例子

trait UserRepositoryComponent {
  def userLocator: UserLocator

  trait UserLocator {
    def findAll: List[User]
  }
}

trait UserRepositoryJPAComponent extends UserRepositoryComponent {
  val em: EntityManager

  def userLocator = new UserLocatorJPA(em)

  class UserLocatorJPA(val em: EntityManager) extends UserLocator {
    def findAll = {
      println("Executing a JPA query")
      List(new User, new User)
    }
  }
}

trait UserServiceComponent {
  def userService: UserService

  trait UserService {
    def findAll: List[User]
  }
}

trait DefaultUserServiceComponent extends UserServiceComponent {
  this: UserRepositoryComponent =>

  def userService = new DefaultUserService

  class DefaultUserService extends UserService {
    def findAll = userLocator.findAll
  }
}

对我来说,似乎太多样板代码无法将JPA信息库注入(inject)服务。

但是,此代码将以更少的行数执行相同的操作
trait UserRepository {
  def findAll
}

trait JPAUserRepository extends UserRepository {
  val em: EntityManager
  def findAll = {
    em.createQuery
    println("find using JPA")
  }
}

trait MyService {
  def findAll
}

trait MyDefaultService extends MyService {
  this: UserRepository=>
}

实例化这两种情况。
val t1 = new DefaultUserServiceComponent with UserRepositoryJPAComponent {
  val em = new EntityManager()
}
t1.userService.findAll


val t2 = new MyDefaultService with JPAUserRepository {
  val em = new EntityManager
}

t2.findAll

第二种情况使用更少的代码,并使用DI。您能帮我了解蛋糕图案带来的额外好处吗?

最佳答案

据我了解,没有太大的区别。实际上,蛋糕模式是IoC。这只是实现IoCDI的想法,无需单独的DI框架,而仅使用Scala代码。除非您需要更多功能,否则您可能应该首选它而不是单独的DI容器。

在我看来,您的两个示例都是蛋糕模式。至少我是这样理解的。但是Martin在他的书中没有将其命名为“蛋糕图案”,而且我将scala mosly的知识基于一本书,因此我可能会遗漏一些东西。我的理解是蛋糕模式是结合不同特征以实现DI的想法

我认为Martin在他的书中特别提到,可以在scala中使用DI -Spring之类的容器是可以的,但是不幸的是我找不到这个地方

更新

找到它:http://www.artima.com/pins1ed/modular-programming-using-objects.html参见27.1 The problem的最后一个子项。但是正如我说的,他在这里不是在谈论“蛋糕”,尽管从您给他的文章看,这个想法看起来是一样的。

更新2

我刚刚重新阅读了我的答案,并了解到我需要改进它,因为它不能完全回答问题。

您应该更喜欢“蛋糕模式”,因为它更简单。如果您使用Spring,则必须维护配置(无论是XML还是注释),您可能还对类有一些要求(我没有使用过Spring,所以不确定是否有任何要求),并且您有带上整个 Spring 。使用蛋糕模式,您只需编写简单的代码即可(您的第二个示例很简单,您应该同意)。 scala的优点是您可以使用它做很多事情,并且仅使用几个框架(如果将其与java进行比较),通常会使用更多的外部库

如果您需要代理等更高级的功能-您可以切换到Spring或继续使用Scala并解决语言本身的问题,希望scala非常强大,甚至可以涵盖复杂的情况。

您提供的两个代码段之间的区别只是抽象:第一个对存储库和服务中定义的操作进行了另一个抽象,而这些都不是模式的一部分。我不认为这是必需的,但作者决定将其显示为这种形式。

关于scala - 蛋糕模式在Scala中的重要性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33083670/

10-10 02:37