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://...")
// ...
}
}
Мы могли бы называть зависимости по-разному в каждом модуле, добавляя к ним префикс перед именем модуля, но это было бы громоздко и не элегантно, а также выигрывало 'не работает, если мы неу нас нет полного контроля над модулями.
Есть идеи? Я неверно истолковываю Шаблон Торта?