0

我正在将 Sangria 用于 Play 应用程序,目前正在努力实现架构定义。问题是,服务没有直接返回所需的对象,它返回一个包含该对象的 EitherT。

下面是一些代码示例

案例类

case class User(name: String, age: Int)

用户服务

def user(): EitherT[Future, AbstractError, User] = {...}

如果服务将返回 aUser而不是 aEitherT[Future, AbstractError, User]我将派生这样的架构:

架构

  val UserType = deriveObjectType[UserService, User]( 
      ObjectTypeName("User"),
      ObjectTypeDescription("A simple user."))

我是否必须实现一个额外的层来UserEitherT对象中提取,或者是否有另一种方法来处理这种情况?

4

2 回答 2

1

您仍然可以派生User对象类型,因为它只是一个简单的案例类。对于加载用户并返回的其他 GraphQL 字段,EitherT您需要将值转换为 sangria 可以使用的值(这意味着这些字段需要手动定义,但您仍然可以derive*对其他字段使用宏)。最简单的方法是将其折叠成一个简单的Future[User]. Future能够保持错误或成功结果。如果您EitherExceptionHandler.

于 2018-03-01T13:14:25.220 回答
0

您还可以在架构中的某处使用从猫EitherT到桑格利亚汽酒的隐式转换:FutureValue

implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))
于 2018-12-12T16:00:15.587 回答