私が遭遇した Cake パターンの例のほとんどは、依存関係をシングルトン タイプのサービスと見なしているように見えます。コンポーネントの最終アセンブリには、各タイプのインスタンスが 1 つだけ存在します。依存性注入に Cake パターンを使用する場合、おそらく異なる方法で構成された、特定のタイプの複数のインスタンスを持つ構成を作成することは可能ですか?
次のコンポーネントを検討してください。汎用 HTTP サービス:
trait HttpService { def get(query:String):String }
trait HttpServiceComponent {
val httpService:HttpService
class HttpServiceImpl(address:String) extends HttpService {
def get(query:String):String = ...
}
}
それぞれ異なるインスタンスである可能性がある HttpService に依存する Trade & Company サービス:
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 が 1 つのアドレスを指す HttpService を使用し、CompanySerivce が別のアドレスを指す別の HttpService インスタンスを使用するようにアプリを接続することは可能ですか?