如何使用 Scala Guice 绑定一个使用单子类型参数扩展 Trait 的类?

2024-02-10

我需要绑定这个特征的实现:

trait ClientRepository[F[_]] {
  def list(): F[Iterable[ClientDTO]]
}

对于这个实现:

import cats.effect.IO

@Singleton
class ClientRepositoryImpl @Inject()(db: OldDataBase, c: IOContextShift)
    extends ClientRepository[IO] {

  override def list(): IO[Iterable[ClientDTO]] = ???
}

我正在使用 Scala Play! v2.7.2 和 Scala v2.12.8,scala-guicev4.2.1。为了将特征绑定到它的实现,我想在我的Module.scala:

class Module(environment: Environment, configuration: Configuration)
    extends AbstractModule
    with ScalaModule {

  override def configure() = {

    bind[ClientRepository].to[ClientRepositoryImpl[IO]].in[Singleton]

  }
}

我得到的错误是:

[error] app/Module.scala:37:9: kinds of the type arguments (ClientRepository) do not conform to the expected kinds of the type parameters (type T).
[error] ClientRepository's type parameters do not match type T's expected parameters:
[error] trait ClientRepository has one type parameter, but type T has none
[error]     bind[ClientRepository].to[ClientRepositoryImpl[IO]].in[Singleton]
[error]         ^
[error] app/Module.scala:37:31: ClientRepositoryImpl does not take type parameters
[error]     bind[ClientRepository].to[ClientRepositoryImpl[IO]].in[Singleton]
[error]                               ^
[error]

我也尝试过:

bind[ClientRepository[IO]].to[ClientRepositoryImpl].in[Singleton]

Module.scala:37:9: kinds of the type arguments (cats.effect.IO) do not conform to the expected kinds of the type parameters (type T).
[error] cats.effect.IO's type parameters do not match type T's expected parameters:
[error] class IO has one type parameter, but type T has none
[error]     bind[ClientRepository[IO]].to[ClientRepositoryImpl].in[Singleton]
[error]         ^

and bind[ClientRepository[IO[_]]].to[ClientRepositoryImpl].in[Singleton]

Module.scala:37:27: cats.effect.IO[_] takes no type parameters, expected: one
[error]     bind[ClientRepository[IO[_]]].to[ClientRepositoryImpl].in[Singleton]
[error]                           ^

解决这个问题的正确方法是什么?


我使用 Guice 找到了正确的解决方案类型文字 https://stackoverflow.com/a/45116111/1977778, 看完之后这个答案 https://stackoverflow.com/a/45116111/1977778 and this one https://stackoverflow.com/a/6274531/1977778.

工作解决方案是:

    // In Module.scala configure()
    bind(new TypeLiteral[ClientRepository[IO]] {}).to(classOf[ClientRepositoryImpl])

因为我们必须提供一个可以实例化的类(带有类型参数,在我们的例子中是IO). TypeLiteral,这是一个特殊的类,使您能够指定完整的参数化类型,可用于创建到我们的特定实现的实际绑定Repo[F[_]]。具有通用参数的类无法实例化,但我们可以强制 Guice 选择特定的参数ClientRepository是用类型参数构造的cats.effect.IO.

最后但并非最不重要的一点是,每当你必须注入特征时ClientRepository您还必须指定类型参数。例如:

class ClientResourceHandler @Inject()(
    routerProvider: Provider[ClientRouter],
    clientRepository: ClientRepository[IO]
)

the ClientResourceHandler需要调用存储库,因此我们使用特征注入它ClientRepository[IO](不只是ClientRepository).

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

如何使用 Scala Guice 绑定一个使用单子类型参数扩展 Trait 的类? 的相关文章

  • 如何从 Scala repl 中取消导入隐式?

    是否可以从 repl 中取消导入隐式内容 说我做这样的事情 scala gt import scala math BigInt import scala math BigInt scala gt implicits 2 implicit m
  • 如何在 Akka Stream 中记录流量?

    我有一个带有单个流 图的 Akka Stream 应用程序 我想测量源头的流量并每 5 秒记录一次 例如 在过去 5 秒内收到 3 条消息 我尝试过 someOtherFlow groupedWithin Integer MAX VALUE
  • 将无形状 HList 转换为 TupleN,其中元组形状不需要与 HList 形状完全匹配

    我想创建相当于 def toTupleN A1 AN L lt HList l L TupleN A1 AN 代码使用toTupleN仅当恰好有一个时才应该编译N中的值的组合l可以从中创建元组 其他任何内容都应该生成编译时错误 应考虑可用的
  • 将列表拆分为多个具有固定元素数量的列表

    如何将元素列表拆分为最多包含 N 个项目的列表 例如 给定一个包含 7 个元素的列表 创建 4 个组 最后一组可能包含较少的元素 split List 1 2 3 4 5 6 seven 4 gt List List 1 2 3 4 Lis
  • 将 Scala Dataframe 写入 CSV 文件时应用 UTF8 编码

    在 Spark2 Scala 中将数据帧写入 CSV 文件时如何正确应用 UTF8 编码 我正在使用这个 df repartition 1 write mode SaveMode Overwrite format csv option he
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • 了解如何使用 apply 和 unappy

    我试图更好地理解 的正确用法apply and unapply方法 考虑到我们想要序列化和反序列化的对象 这是正确的用法吗 即斯卡拉方式 的使用apply and unapply case class Foo object Foo appl
  • 新式(“内联”)宏需要 scala.meta

    我刚刚更新到 scala meta 2 0 0 M1 和最新的 scala 2 12 3 现在宏不再编译 我所做的唯一更改是将元版本从 1 8 0 更改为 2 0 0 M1 错误 新式 内联 宏需要 scala meta 有谁知道是否有快速
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum
  • 宏:knownDirectSubclasses 被嵌套类型破坏?

    我有一个宏 它枚举密封特征的直接子类型 import scala reflect macros Context import language experimental macros object Checker def apply A U
  • 一个 Guice 就绪的安全框架?

    有没有人见过一个为与 Guice 一起工作而编写的框架 或者一个将现有安全系统 即 Acegi 与 Guice 集成的库 到目前为止我发现了以下内容 http code google com p warp security http cod
  • 通用特征的隐式转换

    我正在实现一个数据结构 并希望用户能够使用任何类型作为密钥 只要他提供一个合适的密钥类型来包装它 我有这个关键类型的特质 这个想法是进行从基类型到键类型的隐式转换 反之亦然 实际上 只使用基类型 该特征看起来像这样 trait Key T
  • 如何在 Scala 中打印任何内容的列表?

    目前我有一个打印整数的方法 def printList args List Int Unit args foreach println 我如何修改它 使其足够灵活 可以打印任何内容的列表 您不需要专用的方法 所需的功能已经在集合类中 pri
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • 使用spark phoenix从表中读取rdd分区号为1

    当我运行我的火花代码时 val sqlContext spark sqlContext val noact table primaryDataProcessor getTableData sqlContext zookeeper table
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • Scala 中的 Shapeless 结构编程:如何正确使用 SYB 实现?

    我想使用SYB http research microsoft com en us um people simonpj papers hmap 实施于无形图书馆 https github com milessabin shapeless编写
  • 玩:将表单字段绑定到双精度型?

    也许我只是忽略了一些明显的事情 但我无法弄清楚如何将表单字段绑定到 Play 控制器中的双精度型 例如 假设这是我的模型 case class SavingsGoal timeframeInMonths Option Int amount
  • 分析 sbt 构建

    我的 sbt 构建需要很长时间 它又大又复杂 很难知道从哪里开始清理 看起来 sbt 保留了很多关于构建结构的元数据 包括相互依赖关系 命名任务 范围界定等 有了所有这些元数据 似乎很容易跳入并测量每个不同任务 及其范围 花费的时间 在代码

随机推荐

  • 如何在Android上从方位角获取罗盘方向

    我必须显示用户指向 Android 设备的方向 我在用Sensor TYPE ACCELEROMETER Sensor TYPE MAGNETIC FIELD获取方位角 俯仰角 横滚角 但我能够弄清楚如何从中获取方向 北 南 东 西 请帮忙
  • eclipse使用什么算法在Serialized类中生成verison id?

    假设这是我的班级 class B implements Serializable private static final long serialVersionUID 5186261241138469827L what algo is us
  • 如何在Java中独立于主线程运行线程?

    目标是能够调用执行单独的线程从内部主班 一些背景 我有一个程序必须运行process 过程 一个cmd 仅当主程序执行完毕并从内存中卸载时才应运行 我应该在其中包含什么代码主班 如果你的意思是 我如何启动一个不会在我的 JVM java 程
  • Google 在 iOS 上设置自动完成功能 - 无法加载搜索结果 - 请重试

    我在这里发布这个是因为我不知道还能在哪里发布这个 今天 我们的应用程序不再返回 Google Places API 的结果 我们看到该请求在 Google 开发者控制台上得到通过 但所有手机均未返回任何结果 今天这个数字还在攀升 并且每个用
  • 比较两个指针是否相等的二叉搜索树遍历

    我正在阅读 Cormen 算法书 二叉搜索树章节 它说有两种无需递归即可遍历树的方法 使用堆栈和 更复杂但更优雅 不使用堆栈的解决方案 但 假设两个指针可以 测试平等 我已经实现了第一个选项 使用堆栈 但不知道如何实现后者 这不是作业 只是
  • Ruby 流 tar/gz

    基本上我想将内存中的数据流式传输为 tar gz 格式 可能将多个文件传输到 tar 中 但它永远不应该接触硬盘 只能流式传输 然后将它们流式传输到其他地方 在我的例子中是 HTTP 请求体 有人知道现有的图书馆可以做到这一点吗 Rails
  • 如何清理 if else 系列

    在C 中工作 想要减少if else系列 实体有两个属性FromServiceID and ToServiceID 假设我的ServiceClass实例有以下信息 如何清理以下代码 任何类型的建议都可以接受 entity new Servi
  • 使用 PHP GD 合并两个图像 (.JPG)

    我找不到解决方案 我想给这张图片添加 20px 的空白 http img233 imageshack us img233 419 78317401 jpg http img233 imageshack us img233 419 78317
  • 如何在 python 中使用列表理解来展平多个列表

    我目前有多个由内部列表组成的列表 我已经找到了如何使用列表理解来展平列表 但是如何在不重复使用同一行代码的情况下做到这一点 这是一个示例代码 first 1 2 3 4 5 6 7 8 9 second 3 5 6 0 3 4 third
  • WTSSendMessage 不在远程桌面上显示消息框

    我有一个 Windows 服务应用程序 它显示确认弹出窗口以进行进一步操作 当我在本地计算机上安装服务应用程序时 它工作正常 但当我将其安装在远程计算机上时 不会显示确认弹出窗口 DllImport Kernel32 dll SetLast
  • 如何加快 Amicable 数字算法的速度?

    完成 100 000 的 limit n 需要相当长的时间 我怀疑问题出在计算友好 数字越大 计算时间就越长 我可以改变什么来使其速度比这更快 public static void Main string args CheckAmicabl
  • 多线程访问ArrayList

    我有一个 ArrayList 用于缓冲数据 以便其他线程可以读取它们 该数组不断地添加数据 因为它是从 udp 源读取的 而其他线程不断地从该数组读取数据 然后从数组中删除数据 这不是实际的代码 而是一个简化的示例 public class
  • 如何从裁剪后的图像中找到原始图像

    Hei guys I want to do a application regarding image processing but I dont know what to read first The ideea is that I wa
  • 为什么在二维缩放变换过程中文本变得模糊和摆动

    我想让这张卡在悬停时缩放 包括其中的元素 但文本在转换过程中 当您悬停卡时 摆动 抖动 并且在缩放期间和之后变得模糊 有时 某些比率比其他比率更大 我认为这是由于子像素值舍入所致 如何消除转换过程中的晃动和模糊 我不关心 IE 浏览器 我只
  • EF Core:渴望加载(.Include)子类别(自参考)

    我们有这样的东西 var categories context Categories Include Categories1 Categories1 Categories1 它可以工作并处理高达 4 级深度的子 类别 这对于现在来说已经足够
  • EF 代码优先外键

    我正在与 EF Code First 库合作 尝试开发约会安排应用程序 我的模型将是客户端 约会和约会类型 基本上每个客户端都可以有一组约会 每个约会可以有一个约会类型 代码如下 public class Client ScaffoldCo
  • 如何使用 statsmodels 中模型的常用包装器来应用交叉验证?

    我在这里阅读了相关讨论 使用 statsmodel 估计和 scikit learn 交叉验证 可能吗 https stackoverflow com questions 41045752 using statsmodel estimati
  • 反应路由器未捕获类型错误:无法读取未定义的属性“toUpperCase”

    我正在尝试使用react router 但是当我编写一个简单的路由时不起作用 并且控制台显示 Uncaught TypeError Cannot read property toUpperCase of undefined 否则 当我在没有
  • HTML5 缓存清单和内容类型

    我在读深入研究 HTML5 离线 Web 应用 缓存清单 http fortuito us diveintohtml5 offline html manifest 但必须与 内容类型文本 缓存清单 如果 您正在运行基于 Apache 的 W
  • 如何使用 Scala Guice 绑定一个使用单子类型参数扩展 Trait 的类?

    我需要绑定这个特征的实现 trait ClientRepository F def list F Iterable ClientDTO 对于这个实现 import cats effect IO Singleton class ClientR