Я пытаюсь внедрить инъекцию зависимостей в Scala с шаблоном Cake, но я столкнулся с конфликтами зависимостей. Поскольку я не смог найти подробный пример с такими зависимостями, вот моя проблема:
Предположим, что мы имеем следующую характеристику (с двумя реализациями):
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 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 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://...")
// ...
}
}
Мы могли бы назвать зависимости по-разному в каждом модуле, префикс их с именем модуля, но это было бы громоздким и неэлегантным, а также не будет работать, если мы не будем полностью контролировать сами модули.
Любые идеи? Я неверно истолковал шаблон пирога?