使用隐式自我类型的Scala

时间:2017-06-20 19:24:00

标签: scala mixins implicit-conversion self-type

我有一个需要用户数据库的隐式类。我想在隐式类中使用self-type,这样我就可以将测试范围内的数据库实现切换到模拟版本。在这种情况下,我如何混合数据库提供程序?例如,我希望RuchUser的用户不必担心必须通过提供默认混合来混合UserDatabaseProvider。所以用户可以只做User("name").userContext并在测试范围内做同样的事情,我将提供默认混合使用模拟数据库提供程序?

case class User(name: String)

object User {
  implicit class RichUser(self: User) { this: UserDatabaseProvider =>
     def userContext: String = this.getUserContext(self.name)
  }
}

// Usage of Rich user should be below as I want to provide already mixed-in implicit
import User._
val context = User("name").uerContext

1 个答案:

答案 0 :(得分:1)

我认为你过分复杂了。

case class User(name: String) {
  def context()(implicit db: UserDatabaseProvider): UserContext = {
    db.getUserContext(name)
  }
}

我会进一步建议蛋糕模式可能比使用含义更适用。

class UserService extends UserDatabaseProvider {
  def context(user: User): UserContext = getUserContext(user.name)
}
class TestUserService extends UserService with TestDatabase

让#34;最正确的胜利" Scala中的钻石分辨率可以帮到你。