我正在尝试使用 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://...")
// ...
}
}
我们可以在每个模块中以不同的方式命名依赖项,并在它们前面加上模块名称,但这会很麻烦且不优雅,而且如果我们自己不能完全控制模块,也将无法工作。
有任何想法吗?我误解了蛋糕图案吗?