【问题标题】:How can I reduce the amount of code duplication between my platform-specific projects?如何减少平台特定项目之间的代码重复量?
【发布时间】:2016-02-24 21:19:56
【问题描述】:

我正在开发一个 Xamarin.Forms 解决方案,该解决方案使用 PCL 库在我的 Android 和 iOS 项目之间共享代码。这在大多数情况下效果很好,因为大多数 UI 和逻辑代码都可以保存在一个地方。当然,我使用DependencyService 创建了一些特定于平台的类并链接到 PCL,这对于大多数类来说都很好,因为平台之间的代码有很大不同(例如 UI 布局/外观)。

但是,有一个类子集使用了 PCL 项目不可用的各种命名空间(尤其是 System.Data 命名空间)。为了绕过这个限制,我必须为这些类中的每一个编写一个 DependencyService。我担心的是 Android 和 iOS 之间的代码完全一样,只是少了一两行。代码非常复杂,我不想在需要时记住更新它两次

考虑到由于必要的命名空间不可用,我无法将代码放入 PCL 中,有什么方法可以减少这两个项目之间重复的代码量?

【问题讨论】:

  • 我使用 bait and switch 方法 (log.paulbetts.org/the-bait-and-switch-pcl-trick) 但通过创建两个特定于平台的项目在特定于平台的程序集中使用相同的代码文件,包括/链接每个项目中的这些代码文件一个共享项目,然后对平台之间更改的几行代码使用平台编译器指令......因此,通过将 PCL 样式的代码与平台指令混合,您可以跳过重复的代码 PCL requires ...
  • (cont'd)... 如果您有非常大的接口定义或快速更改的接口定义,为了节省更新 PCL 虚拟签名的时间,我使用 T4 模板来定义和生成接口和平台-特定的部分类...
  • @SushiHangover 不错的把戏。将把那个粘在袖子上:)
  • @Mage Xy,管理那些只有几行差异的大型代码库的有效方法是将有问题的代码放入共享项目并 if-def 该代码。 #ifdef 不是最简洁的方式,但如果它在整个代码主体中只有 1 或 2 行,则成本相当低。

标签: c# xamarin cross-platform xamarin.forms code-duplication


【解决方案1】:

我建议在您的架构中插入一个共享项目。对于需要依赖平台和/或使用平台 API 的代码,我将继续使用由接口抽象的平台类。但是,如果您有可以在这些平台类之间共享的代码,则可以将该代码放在共享项目中并让平台类引用它。

我之前在 SQlite Access 中使用过这种模式。我需要低级别的 ADO.net 支持,这意味着从 SqliteDataReader 手动映射数据。这个逻辑在平台之间是通用的,但不能在 PCL 中使用。所以我有一个用于数据映射的 SharedProject,我的平台数据库实现引用了该项目。

请参阅下面的示例类图。

【讨论】:

    【解决方案2】:

    我能够使用共享项目消除所有重复的代码(正如@matthewrdev 建议的那样)。不过,这个过程比我预期的要复杂一些,所以我将添加一个关于我所做的指南。

    1. 创建一个新的 Xamarin.Forms 共享项目。 (不幸的是,我只能选择创建一个“空白应用程序(共享)”项目,该项目附带预生成的 Android 和 iOS 项目。我删除了这些项目,因为我已经有了必要的平台项目。)

      李>
    2. 将所有重复的代码添加到共享项目中。您可能需要更新命名空间。对于您需要运行特定于平台的任何代码,您必须使用#if __ANDROID__#if __IOS__ 预处理器指令。

    3. 在您的平台项目(在我的例子中,Android 和 iOS)中添加对共享项目的引用。在 VS2013 中,这有点复杂,因为您(显然)无法添加对共享项目的引用。您要么必须手动修改 .csproj 文件(有关详细信息,请参阅 this answer),要么可以使用 VS2013 的 Shared Project Reference Manager 扩展名。

    4. 确保将__ANDROID____IOS__ 条件编译符号添加到您的平台项目中。为此,您需要打开项目的属性,转到“构建”选项卡,然后在显示“条件编译符号”的位置添加符号。

    这些说明适用于 Visual Studio 2013,但对于 Xamarin Studio 和 VS2015 的步骤类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2021-06-18
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多