使用 Scala 进行依赖注入

2024-04-01

我正在寻找一种在 Scala 中进行依赖注入的方法,类似于 C# 中的 Spring 或 Unity,但我没有发现任何真正有趣的东西。

  • MacWire:我不明白这样做有什么好处,因为我们必须在wire[CASS]中上课。那么如果你在调用wire时给出实现又有什么意义呢?我可以做新的 CASS,它会是一样的。
  • 具有自我类型的蛋糕图案:似乎没有回答我正在寻找的内容。

因此,我决定实施并询问您的想法,因为令我惊讶的是,以前从未做过这样的事情。也许我的实现在现实生活中也存在很多问题。

这是一个例子:

trait Messenger {
  def send
}

class SkypeMessenger extends Messenger {
  def send = println("Skype")
}

class ViberMessenger extends Messenger {
  def send = println("Viber")
}

我想在我的应用程序中的所有位置注入仅在一个地方配置的实现:

object App {
  val messenger = Inject[Messenger]

  def main(args: Array[String]) {
    messenger.send
  }
}

请注意我使用我想要的配置(产品或开发)定义的 Inject[Messenger],如下所示:

object Inject extends Injector with DevConfig

trait ProdConfig {
  this: Injector =>
  register[Messager](new SkypeMessager)
  register[Messager](new ViberMessager, "viber")
}

trait DevConfig {
  this: Injector =>
  register[Messager](new ViberMessager)
  register[Messager](new ViberMessager, "viber")
}

最后是注入器,其中包含所有 apply 和 register 方法:

class Injector {
  var map = Map[String, Any]()

  def apply[T: ClassTag] =
    map(classTag[T].toString).asInstanceOf[T]

  def apply[T: ClassTag](id: String) =
    map(classTag[T].toString + id).asInstanceOf[T]

  def register[T: ClassTag](instance: T, id: String = "") = {
    map += (classTag[T].toString + id -> instance)
    instance
  }
}

总结一下:

  • 我有一个类 Injector,它是接口/特征(最终也是一个 id)和实现实例之间的映射。
  • 我们为每个包含寄存器的配置(开发、产品...)定义一个特征。它还有一个对 Injector 的自引用。
  • 然后我们使用我们想要的配置创建一个 Injector 实例
  • 用法是调用提供接口类型(最终也是一个 id)的 apply 方法,它将返回实现的实例。

你怎么认为?


您的代码看起来很像 Lift Web 框架中的依赖注入。您可以查阅 Lift 源代码来了解它是如何实现的,或者只是使用框架。您不必运行 Lift 应用程序即可使用其库。这是一个小介绍doc http://simply.liftweb.net/index-8.2.html。基本上你应该在 Lift 中查看这段代码:

package net.liftweb.http

/**
 * A base trait for a Factory.  A Factory is both an Injector and
 * a collection of FactorMaker instances.  The FactoryMaker instances auto-register
 * with the Injector.  This provides both concrete Maker/Vender functionality as
 * well as Injector functionality.
 */
trait Factory extends SimpleInjector

您还可以检查这个相关问题:Scala - 为使用数据库连接扩展特征/类的对象/单例编写单元测试 https://stackoverflow.com/questions/21965848/scala-write-unit-tests-for-objects-singletons-that-extends-a-trait-class-with我在其中展示了如何使用 Lift 注射器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Scala 进行依赖注入 的相关文章

  • 为什么“private val”和“private Final val”不同?

    我曾经以为private val and private final val是一样的 直到我看到 Scala Reference 中的第 4 1 节 常量值定义的形式为 final val x e 其中 e 是常量表达式 第 6 24 节
  • scala sbt 在多项目上测试运行设置和清理命令一次

    我知道我可以通过修改 testOptions 在 sbt 中添加设置和清理代码以用于测试阶段 例如 val embedMongoTestSettings Seq Setting Seq testOptions in Test Tests S
  • Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

    我正在尝试使用 scalaz iteratee 包在恒定空间中处理大型 zip 文件 我需要对 zip 文件中的每个文件执行一个长时间运行的进程 这些进程可以 并且应该 并行运行 我创建了一个EnumeratorT使每个膨胀ZipEntry
  • 简单的 Scala actor 问题

    我确信这是一个非常简单的问题 但很不好意思地说我无法理解它 我有一个 Scala 值列表 我想使用演员来并行地对每个值进行一些 外部 调用 我想等到所有值都已处理完毕 然后继续 没有共享值被修改 有人可以建议吗 Thanks Scala 中
  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • 让 UnityContainer 变得非线程安全有哪些陷阱?

    我正在向我的库添加依赖项注入 并为此使用 Unity 我想知道是否需要采取一些额外的步骤来使 Unity 容器线程安全 我发现了几篇讨论线程安全容器的文章 例如 http www fascinatedwithsoftware com blo
  • 私有只读接口 - 它是多余的吗?

    我在我的项目中使用 IoC 和 DI 但是我想知道以下是否是一个好的做法 private readonly IMyService myservice 作为服务使用者的类内的字段 该字段在构造函数中设置 我确信我在某处见过这个并且我已经注意到
  • Liftweb 环境中的后台任务

    我必须编写守护进程 并且我想使用模型来连接到数据库和一些有用的 Lift 类 是否可以运行 Rails 的 rake 任务的模拟 Scala 社区组上也有类似的问题 答案是使用Actors来做后台处理
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • Scala:如何编写将类型化为接收者的实现类型的对象返回的方法

    我知道 Scala 中不推荐使用案例类继承 但为了简单起见 我在以下示例中使用了它 scala gt case class Foo val f String def foo g String Foo this copy f g define
  • 自定义 NIO 文件系统无法通过 SBT 的测试任务加载

    为了进行测试 我使用内存中的 NIOFileSystem执行 memoryfs https github com openCage memoryfs 我以前已经利用过它 并且它似乎运行良好 例如梅文 然而 现在 在SBT项目中 不可能初始化
  • autofac 中的条件组件注册

    是否可以根据其他组件的状态有条件地注册组件 就像是 ContainerBuilder RegisterConditionally
  • 宏:knownDirectSubclasses 被嵌套类型破坏?

    我有一个宏 它枚举密封特征的直接子类型 import scala reflect macros Context import language experimental macros object Checker def apply A U
  • 使用策略和工厂模式进行依赖注入

    我正在开展一个业余项目 以更好地理解控制反转和依赖注入以及不同的设计模式 我想知道是否有将 DI 与工厂和策略模式结合使用的最佳实践 当策略 从工厂构建 需要每个可能的构造函数和实现不同的参数时 我面临的挑战就出现了 因此 我发现自己在服务
  • Scala 相当于 Java 的 Number

    我正在尝试为数值域类型构建类型层次结构 例如AYear is an Int 这是一个Number a Percentage is a Double 这是一个Number等等 我需要层次结构以便我可以调用toInt or toDouble关于
  • 框架时代的封装

    在我以前的 C 工作中 我们总是非常小心地封装成员变量 并且仅在绝对必要时才将它们作为属性公开 我们有非常具体的构造函数来确保您在使用对象之前完全构造了该对象 如今 使用 ORM 框架 依赖注入 序列化等 似乎您最好只依赖默认构造函数并在属
  • Source.getLines 中的默认参数错误 (Scala 2.8.0 RC1)

    假设我运行 Scala 2 8 0 RC1 以下 scala 代码应该打印出文件 c hello txt 的内容 for line lt Source fromPath c hello txt getLines println line 但
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer
  • Scala 如何忽略 Java 的检查异常?

    例如如果调用 JavaThread sleep这会抛出一个已检查的InterruptedException来自 Scala 源文件 然后不需要将调用包含在 Scala 中try catch Scala 如何删除将调用包围在 a 中的规则tr
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30

随机推荐

  • Flink 的简单 hello world 示例

    我正在寻找 Apache flink 的 hello world 体验的最简单的示例 假设我刚刚在一个干净的盒子上安装了 flink 那么为了 让它做某事 我需要做的最低限度是什么 我意识到这很模糊 这里有一些例子 来自终端的三个 pyth
  • 解决这个问题的正则表达式是什么?

    我有一个 PHP 数组 其 URL 如下所示 http example com apps 1235554 http example com apps apple http example com apps 126734 http examp
  • 如何在 WP7 中分解 URI?

    是否有一种方法可以访问 WebBrowser 控件中的查询参数 或者我们是否必须手动分解字符串 例如 http www mysite com paramter 12345 我只需要访问参数的值 我知道在使用 xaml 页面时我们有 Quer
  • 为什么有两个类:视图模型和域模型?

    我知道使用域模型作为视图模型可能很糟糕 如果我的域模型有一个名为 IsAdmin 的属性 并且我有一个创建控制器操作来创建用户 那么有人可以更改我的表单并使其 POST IsAdmin true 表单值 即使我没有在视图中公开这样的文本字段
  • 将字符串转换为 Linq.Expressions 或使用字符串作为选择器?

    好吧 我现在有一个字符串 它具有要计算的表达式值 它有说值expr gt expr FieldName 所以我想使用这个字符串作为 Linq 表达式或任何其他查询方式 比如Select str 请帮帮我 虽然我个人没有使用过它 但动态 Li
  • 如何在分布式环境中使用 Estimator API 在 Tensorboard 中显示运行时统计信息

    本文 https www tensorflow org get started graph viz runtime statistics说明了如何将运行时统计添加到 Tensorboard run options tf RunOptions
  • Visual Studio Code:C++ 包含路径

    我目前正在使用https marketplace visualstudio com items itemName mitaki28 vscode clang https marketplace visualstudio com items
  • iOS - 并发访问内存资源

    我的应用程序从服务器 数据和数据描述符下载多个资源 这些由用户操作触发的下载可以同时执行 比如说一次最多 50 个下载 所有这些异步任务最终都会在内存中创建对象 例如 向数据结构添加叶子 例如向可变字典添加键或向数组添加对象 我的问题是 这
  • 如何通过反射忽略父接口上的事件来获取类型的事件

    我有以下代码 Type type var events type GetEvents BindingFlags DeclaredOnly BindingFlags Instance BindingFlags Public ToList 然而
  • 我什么时候必须释放内存?

    我学习了 C 现在正在学习 C 释放内存的整个意义对我来说是新的 我想知道什么时候需要担心内存释放 什么时候不需要 据我了解 我唯一需要担心内存释放的情况是当我使用new运算符 所以我应该使用释放内存delete 但在这些情况下不需要释放内
  • Conda 与 Mamba 的困惑 - 构建自定义 docker 镜像时应该使用什么

    我正在尝试使用构建自定义 Docker 映像jupyter datascience notebook这是基于jupyter base notebook 我可以看到 mamba 用于为 jupyter 安装 配置 conda 环境 下面是我的
  • 为什么此 JSONP 提要抛出“意外令牌”错误?

    我正试图抓住这个远程 JSONP 提要 http calvaryslo onthecity org plaza 2aevents 2a format json通过 jQuery 每次我尝试时 都会收到 Uncaught SyntaxErro
  • 部分类构造函数

    有没有办法让分部类的构造函数调用我的或可能未定义的另一个方法 基本上我的部分类构造函数是这样定义的 public partial class Test public Test do stuff 我希望能够以某种方式插入在调用类构造函数后运行
  • java.lang.ClassCastException:字符串无法转换为日期

    堆栈跟踪 java lang ClassCastException java lang String cannot be cast to java util Date at org hibernate type descriptor jav
  • 检查应用程序范围书签下的路径在沙盒应用程序内是否可写

    我有一个 OS X 应用程序 它存储应用程序范围的书签以持久访问某些目录 我可以毫无问题地写入这些目录 但我的代码中有一部分我想进行额外的检查以确认路径可写并且失败 var fileManager NSFileManager NSFileM
  • AVFoundation 将 Alpha 通道视频叠加在另一个视频上?

    我尝试过将图像覆盖在视频资源上 并且还认为应该有某种方法可以将 Alpha 通道视频覆盖在另一个视频上 有没有办法将 Alpha 通道视频叠加在另一个视频资源上 None
  • 奇怪的 Java HashMap 行为 - 找不到匹配的对象

    当我试图在里面寻找钥匙时 我遇到了一些奇怪的行为java util HashMap 我想我错过了一些东西 代码段基本上是 HashMap
  • 膨胀类 ImageButton 时出错

    我有一个应用程序 其中有fragment and image button关于这一点 问题是它正在上面工作5 0但不低于5 0 最小sdk版本是17 不明白这里出了什么问题 我遇到了 2 个例外 One is RuntimeExceptio
  • Checkstyle Eclipse 插件不起作用

    我正在使用 Juno Eclipse 发行版的 eclipse checkstyle 插件 每当检查代码是否有 checkstyle 错误时 我都会收到以下错误 cannot initialize module TreeWalker Una
  • 使用 Scala 进行依赖注入

    我正在寻找一种在 Scala 中进行依赖注入的方法 类似于 C 中的 Spring 或 Unity 但我没有发现任何真正有趣的东西 MacWire 我不明白这样做有什么好处 因为我们必须在wire CASS 中上课 那么如果你在调用wire