Scala Cake Pattern und Abhängigkeitskollisionen

Ich versuche, die Abhängigkeitsinjektion in Scala mit dem Kuchenmuster zu implementieren, stoße jedoch auf Abhängigkeitskollisionen. Da ich mit solchen Abhängigkeiten kein detailliertes Beispiel finden konnte, ist hier mein Problem:

Angenommen, wir haben das folgende Merkmal (mit 2 Implementierungen):

trait HttpClient {
  def get(url: String)
}

class DefaultHttpClient1 extends HttpClient {
  def get(url: String) = ???
}

class DefaultHttpClient2 extends HttpClient {
  def get(url: String) = ???
}

Und die folgenden zwei Kuchenmustermodule (in diesem Beispiel sind es beide APIs, die von unseren abhängig sindHttpClient für ihre Funktionalität):

trait FooApiModule {
  def httpClient: HttpClient        // dependency
  lazy val fooApi = new FooApi()    // providing the module's service

  class FooApi {
    def foo(url: String): String = {
      val res = httpClient.get(url)
      // ... something foo specific
      ???
    }
  }
}

und

trait BarApiModule {
  def httpClient: HttpClient        // dependency
  lazy val barApi = new BarApi()    // providing the module's service

  class BarApi {
    def bar(url: String): String = {
      val res = httpClient.get(url)
      // ... something bar specific
      ???
    }
  }
}

Wenn wir nun die endgültige App erstellen, die beide Module verwendet, müssen wir die bereitstellenhttpClient Abhängigkeit für beide Module. Aber was ist, wenn wir für jedes der Module eine andere Implementierung bereitstellen möchten? Oder stellen Sie einfach verschiedene Instanzen der Abhängigkeit bereit, die unterschiedlich konfiguriert sind (z. B. mit einer anderenExecutionContext zum Beispiel)?

object MyApp extends FooApiModule with BarApiModule {
  // the same dependency supplied to both modules
  val httpClient = new DefaultHttpClient1()

  def run() = {
    val r1 = fooApi.foo("http://...")
    val r2 = barApi.bar("http://...")
    // ...
  }
}

Wir könnten die Abhängigkeiten in jedem Modul anders benennen und ihnen den Modulnamen voranstellen, aber das wäre umständlich und unelegant und würde auch nicht funktionieren, wenn wir nicht die volle Kontrolle über die Module selbst hätten.

Irgendwelche Ideen? Interpretiere ich das Kuchenmuster falsch?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage