Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以说这个scala代码是依赖注入的吗?_Scala_Dependency Injection_Cake Pattern - Fatal编程技术网

我可以说这个scala代码是依赖注入的吗?

我可以说这个scala代码是依赖注入的吗?,scala,dependency-injection,cake-pattern,Scala,Dependency Injection,Cake Pattern,我读过一些关于Scala蛋糕模式的文章,基本上理解了它。以下是我从本文中复制的一些示例代码: 组成部分: case class User(username:String, password: String) trait UserRepositoryComponent { val userRepository: UserRepository class UserRepository { def authenticate(user: User): User = {

我读过一些关于Scala蛋糕模式的文章,基本上理解了它。以下是我从本文中复制的一些示例代码:

组成部分:

case class User(username:String, password: String)

trait UserRepositoryComponent {
  val userRepository: UserRepository

  class UserRepository {
    def authenticate(user: User): User = { 
      println("authenticating user: " + user)
      user
     }
    def create(user: User) = println("creating user: " + user)
    def delete(user: User) = println("deleting user: " + user)
  }
}


trait UserServiceComponent { this: UserRepositoryComponent =>
  val userService: UserService
  class UserService {
    def authenticate(username: String, password: String): User = 
      userRepository.authenticate(User(username, password))  

    def create(username: String, password: String) = 
      userRepository.create(new User(username, password))

    def delete(user: User) = 
      userRepository.delete(user)

  }
}
要组合它们的对象:

object ComponentRegistry extends 
  UserServiceComponent with 
  UserRepositoryComponent {
  val userRepository = new UserRepository
  val userService = new UserService
}

object TestingComponentRegistry extends 
  UserServiceComponent with 
  UserRepositoryComponent {
  val userRepository = mock[UserRepository]
  val userService = mock[UserService]
}
object Application {
  val userService = new UserService(new UserRepository)
}

object Test {
  val userService = new UserService(mock[UserRepository]) 
}
如果我在一个简单的项目中,我想让它变得更简单。代码如下所示:

case class User(username:String, password: String)

class UserRepository {
  def authenticate(user: User): User = { 
    println("authenticating user: " + user)
    user
   }
  def create(user: User) = println("creating user: " + user)
  def delete(user: User) = println("deleting user: " + user)
}

class UserService(userRepository: UserRepository) {
  def authenticate(username: String, password: String): User = 
    userRepository.authenticate(User(username, password))  

  def create(username: String, password: String) = 
    userRepository.create(new User(username, password))

  def delete(user: User) = 
    userRepository.delete(user)

}
将它们结合起来:

object ComponentRegistry extends 
  UserServiceComponent with 
  UserRepositoryComponent {
  val userRepository = new UserRepository
  val userService = new UserService
}

object TestingComponentRegistry extends 
  UserServiceComponent with 
  UserRepositoryComponent {
  val userRepository = mock[UserRepository]
  val userService = mock[UserService]
}
object Application {
  val userService = new UserService(new UserRepository)
}

object Test {
  val userService = new UserService(mock[UserRepository]) 
}
我的问题是,我的代码是否仍然可以被视为“依赖注入”

  • 我在
    UserService
    的构造函数中声明了依赖项
  • 我将它们与不同环境中的对象组合在一起
  • 但是我没有提供一些特性作为“组件”。

    是的,您的代码是“依赖注入的”:
    UserService
    接收它应该用作构造函数参数的组件,而不是在
    UserService
    中直接实例化
    UserRepository

    IMHO,您的代码正是DI 90%以上的时候应该使用的代码。不需要像Spring或Guice这样的“花哨”框架,不需要像cake模式这样的“花哨”设计模式,只需在构造函数中注入依赖项即可。完成、干净、易于测试、易于更换不同的实现(*)


    (*):请注意,在您的示例中,要实现这一点,
    UserRepository
    可能应该是一个特性,而不是一个类。

    我非常喜欢您的答案:)这就是蛋糕模式,经常使用它的是所谓的“依赖注入”,从这个角度来看,它可以被视为“组件化”的特例由蛋糕促进的软件。