我有一个特征DbClientUtil如下:
trait DbClientUtil{
lazy val dbClient = //Initializing client here
}
我有一个Dbhelper对象,它扩展了DbClientUtil特性,如下所示:
object DbHelper extends DbClientUtil{
def sendDbPayload(dbModel:DbModel):Unit = {
dbClient.sendData(dbModel)
}
}
在以上给出的示例中,sendData
是的方法dbClient
。
现在,我要遍历集合,将元素转换为模型,将其发送到数据库,然后关闭客户端。
因此,我在以下对象中写出了该策略
object Runner extends DbClientUtil{
import DbHelper._
List(DbModel("model1"),DbModel("model2"),DbModel("model3")).foreach{
model => sendDbPayload(model)
}
dbClient.shutdown
}
我有两个具有相同特征的对象。DBHelper
并Runner
延伸相同的特征DbClientUtil
。在DbClientUtil
初始化dbClient
。和和dbClient
都使用了已初始化。我的问题是,我要初始化两次吗?我的下一个问题是,如果我将其初始化两次,哪种更好的重写方式来防止任何多余的初始化?DbHelper
Runner
dbClient
谢谢
其实,是。DbClientUtil初始化两次:首先通过DbHelper,然后通过Runner。如果这是一个问题,有很多方法可以解决此问题:
1)使DbClientUtil
无状态并将其重写为def dbClient
。实际上,这是一个很好的解决方案,因为您的状态应该存储在数据库中,而不取决于您实例化了多少个客户端。
2)创建单例。只有一个。不是两个:
object DbClientUtil extends DbClientUtil
object DbHelper extends DbClientUtil{
def sendDbPayload(dbModel:DbModel):Unit = {
DbClientUtil.sendData(dbModel)
}
}
object Runner {
List(DbModel("model1"),DbModel("model2"),DbModel("model3")).foreach{
model => DbHelper.sendDbPayload(model)
}
DbHelper.shutdown //Use just one client, not two
}
但实际上我不喜欢这样。严格的依赖关系使您耦合度更高
3)使用依赖注入。我猜这是大型项目的最佳解决方案之一。例如,您可以使用Google Guice:
trait DbClientService {
def sendData(data: Any): Unit //No implementation
}
class DbClientServiceImpl extends DbClientService
def sendData(data: Any): Unit {
//write you implementation code
}
}
绑定它:https : //github.com/codingwell/scala-guice/
class ServiceModule extends AbstractModule {
protected def configure() {
bind[DbClientService].to[DbClientServiceImpl].in[Singleton]
}
}
然后注入它:
class DbHelper @Inject()(dbClient:DbClientService) extends DbClientUtil{
def sendDbPayload(dbModel:DbModel):Unit = {
dbClient.sendData(dbModel)
}
}
class Runner @Inject()(dbClient:DbClientService) extends DbClientUtil{
List(DbModel("model1"),DbModel("model2"),DbModel("model3")).foreach{
model => dbClient.sendDbPayload(model)
}
dbClient.shutdown
//still, don't know if it is good solution
//to control client state from outer scope
//better make this logic private
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句