我正在尝试创建一个 ZIO 模块的示例,它有两种实现:
- 将 YAML 与 circe-yaml 一起使用
- 将 HOCON 与 pureConfig 一起使用
我的一般界面如下所示:
trait Service[R] {
def load[T <: Component](ref: CompRef): RIO[R, T]
}
现在我的 YAML 实现看起来像:
def loadYaml[T <: Component: Decoder](ref: CompRef): RIO[Any, T] = {...}
这Decoder
是特定于实现的。
现在的问题是如何将服务实现委托给loadYaml
.
我尝试了以下方法:
val components: Components.Service[Any] = new Components.Service[Any] {
implicit val decodeComponent: Decoder[Component] =
List[Decoder[Component]](
Decoder[DbConnection].widen,
...
).reduceLeft(_ or _)
def load[T <: Component](ref: CompRef): RIO[Any, T] = loadYaml[T] (ref)
}
这给了我:
Error:(62, 20) could not find implicit value for evidence parameter of type io.circe.Decoder[T]
loadYaml[T] (ref)
有没有办法做到这一点?
我在 Github 上创建了一个示例项目:zio-comps-module
这里描述了这个想法:Decouple the Program from its Implementation with ZIO modules