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 模型属性未访问 ReactJs 中的对象