【问题标题】:Using traits for mixing core libraries in Scala在 Scala 中使用特征混合核心库
【发布时间】:2017-07-11 08:10:10
【问题描述】:

我正在使用 Scala 开发多 SBT 项目。我将核心内容提取到单独的 SBT 项目中。这包括处理配置、第三方库(初始化 RMQ 客户端、初始化 Redis 客户端等)和一些模型。

所以我组织了一些事情,比如在 trait 中加载配置,然后我在需要的地方混合这个 trait,只使用在 Configuration trait 中定义的 config 方法,它为特定环境加载配置(基于环境变量)。我对数据库做了同样的事情,所以我加载 PostgreSQL,打开连接,然后在我需要的地方混合该特征,并使用 database 方法,我可以使用它来执行查询和其他操作。

您认为这是一种好方法吗?优点是我不必在每个项目中处理数据库连接和初始化,而且代码也更短。但是,关闭连接存在一个问题。在数据库混合的 trait 中在哪里关闭连接?

感谢任何有关该主题的帮助。谢谢

美国

【问题讨论】:

    标签: scala oop traits


    【解决方案1】:

    关于连接,您应该在完成连接后关闭它们(返回池),这与混合实现是正交的。

    至于配置等,我喜欢这种方法,但它的问题是大多数时候你希望加载 config 之类的东西是单例的,但如果你只是做类似的事情

      trait Configuration { 
         val config = loadConfig
      }
    
      class Foo with Configuration
      class Bar with Configuration
      val f1 = new Foo
      val f2 = new Foo
      val b1 = new Bar
      val b2 = new Bar
    

    然后,您最终会加载四个不同的配置副本。 解决此问题的一种方法是将loadConfig 委托给单例对象:

     object Configuration {
        val config = loadConfig
     }
     trait Configuration { 
        def config = Configration.config
     }
    

    这行得通,但让单元测试和覆盖功能变得更加困难(如果我希望有时从数据库加载配置怎么办?)

    另一种可能是代理类:

    trait Configuration {
      def loadConfig: Config
      lazy val config: Config = loadConfig
    }
    
    class ConfigurationProxy(cfg: Configuration) extends Configuration {
       def loadConfig = cfg.config
    }
    
    object Main extends App with Configuration {
       def loadConfig = ??? // executed only one per application 
       ...
    }
    
    class Foo extends ConfigurationProxy(Main)
    class Bar extends ConfigurationProxy(Main)
    
    val f1 = new Foo
    val f2 = new Foo
    val b1 = new Bar
    val b2 = new Bar
    

    现在,所有四个变量都在查看同一个 Config 实例。 但是如果你有一个函数需要Configuration,你仍然可以传递其中的任何一个:

    def connectToDB(cfg: Configuration) = ???
    
    connectToDB(Main)
    connectToDB(f1)
    connectToDB(b2)
    

    等等

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      相关资源
      最近更新 更多