如何使用 macwire 注入特征

How to inject a trait with macwire

我有 Scala 特质

trait UserRepository {
  def findByEmail(email: String): User
}

我想用 MacWire 将其注入服务

class AccountService(){
  val userRepo = wire[UserRepository]
}

然后在测试中使用它或class

class AccountServiceSpec {
  val userRepo = new UserRepositoryImpl()
  val accountSvc = new AccountService() //<--not manually injecting repo in service constructor
}

但我在服务中遇到编译错误 class

Cannot find a public constructor nor a companion object for accounts.repository.UserRepository

您可以尝试将 userRepo 转换为 class 参数,使 macwire 自动为服务提供其值:

import com.softwaremill.macwire._

case class User(email: String)

trait UserRepository {
  def findByEmail(email: String): User
}

class AccountService(val userRepo: UserRepository)

class UserRepositoryImpl extends UserRepository{
  def findByEmail(email: String): User = new User(email)
}

class AccountServiceSpec {
  val userRepo = new UserRepositoryImpl()
  val accountSvc = wire[AccountService] //<--not manually injecting repo in service constructor
}