我正在尝试使用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) = ???
}
Run Code Online (Sandbox Code Playgroud)
以下两个蛋糕模式模块(在此示例中都是依赖于我们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
???
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
trait BarApiModule …Run Code Online (Sandbox Code Playgroud) 我是Scala的新手,正在编写一个API库并尝试仅使用val和不可变对象(如果可能).我正在尝试确定对象建模的正确方法.假设有几个"Post"对象,它们共享一些公共字段,并且每个对象都添加自己的特定字段:
abstract class Post(val id: Int, val name: String, ...)
case class TextPost(val id: Int, val name: String, ..., val text: String) extends Post(id, name, ...)
case class PhotoPost(val id: Int, val name: String, ..., val url: String) extends Post(id, name, ...)
Run Code Online (Sandbox Code Playgroud)
此方法添加了大量重复声明和样板代码,尤其是在处理抽象类中的许多Post子类和共享字段时.我看待它的方式,这是由使用vals引起的,这些val只能由构造函数初始化.有没有更好的方法来创建这里详述的关系,或者我是否必须因为只想使用不可变对象而受到影响?
我想有以下SBT构建设置:
object MyBuild extends Build {
lazy val core = Project("core", file("core"))
.dependsOn(testkit % "test")
lazy val testkit = Project("testkit", file("testkit"))
.dependsOn(core % "compile")
}
Run Code Online (Sandbox Code Playgroud)
什么core是主模块,包括域对象,并且testkit是一个模块,用于测试依赖于域对象和其他类/工具的支持代码(构建器,匹配器,测试驱动程序等; 而不是测试本身)core.
对于此设置SBT给出了一个Cyclic reference错误,虽然不是一个真正的循环依赖,因为使用不同配置(core编译,然后testkit根据汇总core,然后core test根据这两个编译).
我找到了一种通过替换其中一个dependsOn用途来解决这个问题的肮脏方法unmanagedClasspath,例如:
.settings(unmanagedClasspath in Compile <+= (packageBin in (LocalProject("core"), Compile)))
Run Code Online (Sandbox Code Playgroud)
这感觉就像一个黑客,并且还会sbt-idea生成不正确的IntelliJ项目(除其他外).
想要更好的解决方案吗?SBT是否支持这样的结构?