小编orr*_*lla的帖子

斯卡拉蛋糕模式和依赖性冲突

我正在尝试使用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)

dependency-injection scala cake-pattern

11
推荐指数
1
解决办法
517
查看次数

Scala扩展参数化抽象类

我是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只能由构造函数初始化.有没有更好的方法来创建这里详述的关系,或者我是否必须因为只想使用不可变对象而受到影响?

oop inheritance scala

10
推荐指数
1
解决办法
7484
查看次数

如何在不同配置中将SBT用于相互依赖的项目

我想有以下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是否支持这样的结构?

scala sbt cyclic-dependency

6
推荐指数
1
解决办法
375
查看次数