我正在尝试使用Cake Pattern在Scala中实现依赖注入,但是遇到依赖冲突.由于我找不到具有此类依赖关系的详细示例,这是我的问题:
假设我们有以下特征(有2个实现):
trait HttpClient {
def get(url: String)
}
class DefaultHttpClient1 extends HttpClient {
def get(url: String) = ???
}
class DefaultHttpClient2 extends HttpClient {
def get(url: String) = ???
}
以下两个蛋糕模式模块(在此示例中都是依赖于我们HttpClient
的功能的API ):
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://...")
// ...
}
}
我们可以在每个模块中以不同的方式命名依赖项,在它们前面加上模块名称,但这样做既麻烦又不优雅,如果我们自己没有对模块的完全控制也无法工作.
有任何想法吗?我是否误解了蛋糕模式?