【问题标题】:How to handle cross cutting concerns the Scala way如何以 Scala 方式处理横切关注点
【发布时间】:2015-04-18 06:35:25
【问题描述】:

因为我刚刚在我的代码中实现了 Log4j,所以我正在网上阅读有关横切关注点的信息。有些人说使用 AspectJ 没问题,而另一些人则指出它破坏了函数式编程。那个 mixins 是 Scala 的横切关注点的解决方案。

但是,当我认为我会将特征扩展到一个本身不相关的对象/类时,我会感到畏缩。

例如new Database with Logger

这里LoggerDatabase无关,而是如何混合提供日志记录。我更喜欢用 Scala 的方式来做,所以我想知道这就是人们所说的 mixins 的意思。

有人可以给我看一个如何在 Scala 中进行此操作的简单示例吗?

【问题讨论】:

    标签: scala aop scala-2.10 cross-cutting-concerns


    【解决方案1】:

    这是一个很大的话题,有很多潜在的“正确”答案。我个人最喜欢的是使用“按名称参数”或更高阶函数。

    一个非常简单的例子:

    object Logging {
      def logCall[T](name: String)(block: => T): T = {
        log.info(s"Invoking: $name")
        block
      }
    }
    

    这将允许您将它应用在一个本身知道横切关注点的对象中(就像在 java 中用一些东西注释包装一个方法调用):

    class DB {
      import Logging._
      def insert(item: Something) = logCall("insert") {
        ???
      }
    }
    

    或在通话现场:

    import Logging._
    def businessLogic() {
      val user = ???
      val result = logCall("insert user")(DB.insert(user))
      println(result)
    }
    

    这样做的好处是它非常明确且不言自明(这也是您可能重视或不重视的事情)。

    【讨论】:

    • 这与Java中的全局变量相同。并且会否定依赖注入的目的。
    • 这与在 Java 中拥有全局变量绝对不是一回事,如果你有想要在横切关注点中可用的依赖项,你可以将它们作为常规或隐式参数传递给横切法。没有什么要求 Logging 是一个单例,这样做只是为了使代码示例简短(并且因为您很少会注入记录器)。
    猜你喜欢
    • 2018-12-28
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多