GraphQL 对象映射 Apollo 与目标不同的模式

Posted

技术标签:

【中文标题】GraphQL 对象映射 Apollo 与目标不同的模式【英文标题】:GraphQL Object mapping Apollo with different schema by target 【发布时间】:2019-02-02 18:24:22 【问题描述】:

我有一个包含多个目标的项目。

我已经实现了 Apollo 来使用 GraphQL 请求数据库。目标的架构略有相同,但存在一些差异:+1 或 2 个字段,具体取决于目标。

我可以成功构建我的应用程序,因为我已将构建阶段更改为仅构建 *common.graphql 和 *targetname.graphql

所以当目标 A 有这样的 AnnuaireFragment 时:

fragment AnnuaireFragment on Directory 
    id
    test

目标 B 有这样的 AnnuaireFragment:

fragment AnnuaireFragment on Directory 
    id

一切都可以构建,碎片被分离。

我希望当我使用翻译器时我也可以构建。我可以为两个目标只使用一个翻译器吗?

static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel 
            let contactModel = ContactModel()
            contactModel._id = annuaireNode.id
            // Here that doesn't build for target B because annuaireNode.test doesn't exist
            contactModel.test = annuaireNode.test

            return contactModel

我怎样才能成功地为目标 A 和 B 构建我的应用程序?

【问题讨论】:

【参考方案1】:

在为目标 B 构建时,编译器不知道存在 GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node 的不同类定义,这是特定于目标 A 的。这意味着此错误是编译时错误,并且是唯一可能的方法解决它是在编译时解决它。

我能想出的可能解决方案是针对不同的目标使用不同的编译条件。

设置如下:

    在您的一个目标位置TARGET_A 和另一个位置TARGET_B 的构建设置下

    在编译时使用#if 区分目标

    static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel 
        let contactModel = ContactModel()
        contactModel._id = annuaireNode.id
    
    
        #if TARGET_A
        //The code here will only be compiled when building target A
        contactModel.test = annuaireNode.test
        #endif
    
        return contactModel
    
    

【讨论】:

你说得对,这行得通,谢谢! :) 我等着看是否有其他解决方案,如果没有,我会检查是否接受的答案!

以上是关于GraphQL 对象映射 Apollo 与目标不同的模式的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL:用于查询返回不同类型对象的模式?

既不是突变也不是查询的 Apollo/GraphQL 动作

在 Apollo GraphQL 中跨本地和远程模式的嵌套数组中建模数据的最佳方法?

Apollo GraphQl 模型属性未访问 ReactJs 中的对象

如何在 react/js 中映射别名 graphql 查询?

apollo (graphQL) - 如何在查询中发送对象数组