在特征中初始化数据库客户端

sc_ray

我有一个特征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
}

我有两个具有相同特征的对象。DBHelperRunner延伸相同的特征DbClientUtilDbClientUtil初始化dbClient和和dbClient都使用了已初始化我的问题是,我要初始化两次吗?我的下一个问题是,如果我将其初始化两次,哪种更好的重写方式来防止任何多余的初始化?DbHelperRunnerdbClient

谢谢

Bask.ws

其实,是。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

数据库客户端抽象

来自分类Dev

Hostmonster上的旅客错误:“无法初始化MySQL客户端库”

来自分类Dev

多线程客户端中COM对象的初始化和实例化

来自分类Dev

soap webservice php客户端参数初始化

来自分类Dev

Elasticsearch Java客户端初始化失败

来自分类Dev

在页面初始化期间完成客户端工作

来自分类Dev

soap webservice php客户端参数初始化

来自分类Dev

如何初始化 Kony Fabric 客户端

来自分类Dev

在Jersey资源中初始化数据库

来自分类Dev

在代码优先的 SQLite 中初始化数据库

来自分类Dev

在Spring受管bean的构造函数中初始化泽西客户端

来自分类Dev

在Django App中初始化GraphQL客户端的位置

来自分类Dev

在应用程序中初始化改造客户端

来自分类Dev

Azure数据库初始化

来自分类Dev

TIB数据库更改客户端库

来自分类Dev

Angular 2 http Post在客户端失败,但数据已插入数据库中

来自分类Dev

客户端数据库的工厂和指令

来自分类Dev

数据库客户端设计以支持不同的后端

来自分类Dev

以蛋糕模式抽象数据库客户端

来自分类Dev

Laravel API连接到客户端数据库

来自分类Dev

客户端可访问的noSql数据库?

来自分类Dev

发送数据库查询结果给客户端

来自分类Dev

使用PHP访问客户端的SQL数据库

来自分类Dev

MFC Dekstop客户端的数据库选择

来自分类Dev

Jersey REST客户端未创建数据库

来自分类Dev

客户端可移植数据库,用什么?

来自分类Dev

将客户端IP存储在数据库中

来自分类Dev

仅当新条目进入Django中的数据库时才更新客户端页面

来自分类Dev

如何使用客户端Windows凭据连接到Web中的SQL Server数据库