Macwire, wireWith и неявные параметры

wireWith похоже, есть некоторые проблемы с разрешением неявных параметров.

Минимальный пример:

import com.softwaremill.macwire._

object A {
  def props(x: Int)(implicit y: String): A = new A(x)
}

class A(x: Int)(implicit y: String) {
   val sum: String = s"$x + $y"
}

object App {
   def main(): Unit = {
     val xVal: Int = 3
     implicit val yVal: String = "5"

     // val aInstance = wire[A] // works
     // val aInstance = A.props(xVal) // works
     val aInstance: A = wireWith(A.props _) // compile error

     println(aInstance.sum)
  }
}

App.main()

Ошибка:

Error:(21, 33) type mismatch; found   : Int required: String
    val aInstance: A = wireWith(A.props _)
                           ^

Если implicit опущен в yValЖалуется на отсутствие неявного:

Error:(18, 36) could not find implicit value for parameter y: String 
    val aInstance: A = wireWith(A.props _) // compile error
                              ^

Хотя это упрощенный пример - в моем производственном коде я пытаюсь подключить реквизиты Actor:

object Actor {
    def props
        (dependency: Dependency, refreshInterval: FiniteDuration @@ CacheRefreshInterval)
        (implicit ec: ExecutionContext): Props =
            Props(new Actor(dependency, refreshInterval))
}

// DI container
protected implicit def executionContext: ExecutionContext
protected lazy val dependency: Dependency = wire[Dependency]
protected lazy val refreshInterval = 2.second.taggedWith[CacheRefreshInterval]
protected lazy val actorProps: Props @@ ActorProps = actorwireWith(Actor.props _)

и получить другую ошибку компиляции:

too many arguments for method props: (implicit ec: scala.concurrent.ExecutionContext)akka.actor.Props

Я попытался сделать неявный параметр явным, и он работал просто отлично, за исключением того, что это немного противоречит обычной практике неявной передачи контекста выполнения.

Я делаю что-то не так или это проблема в Macwire?

Проблема в Github: https://github.com/adamw/macwire/issues/125

1 ответ

Если бы вы использовали wireWith(A.props _) В качестве обходного пути для неспособности macwire связывать актеров, когда их конструктор использует неявные параметры (см. выпуск 121 для macwire), вы можете переключиться на macwire 2.3.1 и связать акторов, используя wireActor[A], wireAnonymousActor[A] или же wireProps[A], проблема 121 была исправлена ​​в Macwire 2.3.1.

Другие вопросы по тегам