Scala Cake Pattern и коллизии зависимостей

Я пытаюсь реализовать внедрение зависимостей в Scala с Cake Pattern, но сталкиваюсь с коллизиями зависимостей. Поскольку я не смог найти подробный пример с такими зависимостями, здесь 'моя проблема:

Предположим, у нас есть следующая черта (с 2 реализациями):

trait HttpClient {
  def get(url: String)
}

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

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

И следующие два модуля шаблона торта (которые в этом примере являются API, которые зависят от нашегоHttpClient за их функциональность):

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
      ???
    }
  }
}

а также

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
      ???
    }
  }
}

Теперь при создании окончательного приложения, в котором используются оба модуля, нам необходимо предоставитьhttpClient зависимость для обоих модулей. Но что, если мы хотим обеспечить различную реализацию этого для каждого из модулей? Или просто предоставьте разные экземпляры зависимости, настроенные по-разному (скажем, с другимExecutionContext например)?

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://...")
    // ...
  }
}

Мы могли бы называть зависимости по-разному в каждом модуле, добавляя к ним префикс перед именем модуля, но это было бы громоздко и не элегантно, а также выигрывало 'не работает, если мы неу нас нет полного контроля над модулями.

Есть идеи? Я неверно истолковываю Шаблон Торта?

Ответы на вопрос(5)

Ваш ответ на вопрос