Большинство примеров Cake Pattern, с которыми я сталкивался, похоже, рассматривают зависимости как сервисы синглтонного типа; где имеется только один экземпляр каждого типа в окончательной сборке компонентов. Можно ли написать конфигурацию, которая имеет более одного экземпляра определенного типа, возможно, настроенного по-разному, при использовании Cake Pattern для внедрения зависимостей?
Рассмотрим следующие компоненты. Общий HTTP-сервис:
trait HttpService { def get(query:String):String }
trait HttpServiceComponent {
val httpService:HttpService
class HttpServiceImpl(address:String) extends HttpService {
def get(query:String):String = ...
}
}
Услуги Trade & Company, каждый из которых зависит от HttpService, которые могут быть разными:
trait TradeService { def lastTrade(symbol:String):String }
trait TradeServiceComponent {
this:HttpServiceComponent => // Depends on HttpService
val tradeService:TradeService
class TradeServiceImpl extends TradeService {
def lastTrade(symbol:String):String =
httpService.get("symbol=" + symbol)
}
}
trait CompanyService { def getCompanySymbols(exchange:String):String }
trait CompanyServiceComponent {
this:HttpServiceComponent => // Depends on different HttpService instance
val companyService:CompanyService
class CompanyServiceImpl extends CompanyService {
def getCompanySymbols(exchange:String):String =
httpService.get("exchange=" + exchange)
}
}
Основной компонент приложения, который зависит от услуг Trade & Company:
trait App { def run(exchange:String):Unit }
trait AppComponent {
this:CompanyServiceComponent with TradeServiceComponent =>
val app:App
class AppImpl extends App {
def run(exchange:String) =
companyService.getCompanySymbols(exchange).split(",").foreach(sym => {
val lastTrade = tradeService.lastTrade(sym)
printf("Last trade for %s: %s".format(sym, lastTrade))
})
}
}
Можно ли подключить приложение, чтобы его TradeService использовал HttpService, который указывает на один адрес, а его CompanySerivce использует другой экземпляр HttpService, указывающий на другой адрес?