Scala 使用隐式自类型
Scala using Implicit with Self Types
我有一个需要用户数据库的隐式 class。我想在隐式 class 中使用自类型,这样我就可以将测试范围内的数据库实现切换到模拟版本。在这种情况下,我该如何混入数据库提供程序?例如,我希望 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
我认为你过于复杂了。
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
让 "right-most wins" Scala 中的菱形分辨率为您完成这项工作。
我有一个需要用户数据库的隐式 class。我想在隐式 class 中使用自类型,这样我就可以将测试范围内的数据库实现切换到模拟版本。在这种情况下,我该如何混入数据库提供程序?例如,我希望 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
我认为你过于复杂了。
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
让 "right-most wins" Scala 中的菱形分辨率为您完成这项工作。