2017-06-20 4 views
2

J'ai une classe implicite qui nécessite une base de données utilisateur. Je veux utiliser self-type dans la classe implicite afin que je puisse basculer l'implémentation de la base de données dans la portée de test vers la version mockée. Comment puis-je mélanger le fournisseur de base de données dans ce cas? Par exemple, je veux que l'utilisateur de RuchUser ne s'inquiète pas d'avoir à mélanger UserDatabaseProvider en fournissant un mixage par défaut. Donc, l'utilisateur peut simplement faire User("name").userContext et faire la même chose à la portée de test où je vais fournir le mélange par défaut pour utiliser le fournisseur de base de données simulé?Scala utilisant implicite avec les types auto

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 

Répondre

1

Je pense que vous êtes trop compliqué.

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

Je voudrais aller plus loin suggérer que le modèle de gâteau peut être plus applicable ici que d'utiliser implicits. Laissez la résolution «diamant le plus à droite» dans Scala faire le travail à votre place.