修改
更复杂的是,似乎存在一个问题(正在Play 2.1快照中进行处理),其中路由文件更改也可以触发加盖群体效应,也就是说,重新编译控制器和依赖项。一旦解决了这个问题,并且Scala 2.10 + SBT 0.12.1性能增强功能得到了集成,那么基于特征的DAO存储库可以让我更加清晰地了解自己的数量......
ORIGINAL
我是英国人说的很多,很多有能力的,不用担心,只是把你吸引到......可怕的慢的一个$$汇编区
trait DaoProviderContract {
def team: TeamContract
def player: PlayerContract
}
object DaoRepo extends DaoProviderContract {
import com.company.utils.{Connection, Driver}
implicit lazy val db = Connection.getHandle(Driver.DEFAULT)
val team = new TeamDAO
val player = new PlayerDAO
}
trait DaoProvider[Contract <: com.company.dao.DAOContract[_]] {
val daoRepo = DaoRepo
val dao: Contract
}
trait TeamData extends DaoProvider[TeamContract] {
val dao: TeamContract = daoRepo.team
}
trait PlayerData extends DaoProvider[PlayerContract] {
val dao: PlayerContract = daoRepo.player
}
然后在控制器中混合DAO组件:
object Player extends Controller with PlayerData {
....
}
对上述控制器进行更改似乎会触发重新编译依赖于DAO提供程序的所有源代码,在我的情况下,这是一堆控制器。净影响是我常常看到我的应用程序中有近3/4重新编译,很烦人。
现在,SBT 0.12.1在编译速度方面有所改进,但就重新编译的内容而言,我的DAO存储库实现显然无济于事。
所以,我的问题是,在这种情况下,我应该废弃这些特征并将DaoRepo对象直接暴露给控制器吗?然后播放器控制器看起来像:
import model.{DaoRepo => repo}
object Player extends Controller { // with PlayerData mixin gone
def player(id: Int) = repo.player.get(id)
}
我是否认为对修改后的播放器控制器进行更改不会触发重新编译3/4的应用程序?我知道,不可能直接使用DaoRepo对象进行测试,但是等待也不是很有效率。
感谢您的反馈,如果您已经得到它:帮助SBT重新编译必要的......
答案 0 :(得分:2)
通过避免填充具有多个特征/类/对象定义的单个文件,可以使SBT增量过程更加智能化。如果您的文件包含:
trait A { }
trait B extends Base { }
更改Base
的定义将触发重新编译文件,这将反过来触发每个文件的重新编译,其中A
或B
是称为...
尝试将DAO和PlayerData
类拆分为多个文件。