值得一提的是,“作者”和“书”模块依赖于“身份验证”模块来服务经过身份验证的用户实体,以便后端可以返回个性化响应 —— 作家和书籍。
实际问题
这种方法在 Android 应用程序中效果很好,但是一旦将其应用于导入了 KMP 驱动的框架的 iOS 应用程序中,就会产生繁琐的问题。
实际的问题是,在 iOS 模块的编译过程中,Kotlin/Native 插件包含了当前已编译的模块中全部的依赖关系,因此它是内置的。此外,为防止冲突,它会在所有显式的依赖项名的前面加上对应的库名。
这对于单个模块或一组独立模块非常方便。但是,一旦两个或多个模块使用了 iOS 应用程序可见的相同依赖项,你就复制出了多个版本的相同依赖项。
在我们的示例中,来自作者模块的用户实体和来自图书模块的用户实体在 Android 应用程序中将是相同的,但在 iOS 应用程序中将是两个不同的实体,即使它们是相同的。
换句话说,我们在 iOS 应用程序中会有两个截然不同的身份验证模块,而且它们之间不共享任何内容,毫无关联 —— 不共享类、状态等一切东西!
实际解决方案
我有幸与一个 KMP 团队探讨了这个问题,他们推荐的解决方案(至少这是 6 个月前的最优解)是使用 Umbrella 模块,它包含了所有共享的 KMP 模块。这是一个会被导入到 iOS 应用程序中的框架。