【问题标题】:Xamarin Shared Projects vs Portable class librariesXamarin 共享项目与可移植类库
【发布时间】:2017-01-06 19:29:43
【问题描述】:

我正在尝试找出哪种方式更适合我们的项目。

Xamarin 的 PCL 库或共享项目。

Xamarin documentation link here 中说,经验法则是当我们不共享库时选择共享项目。可以使用 #if 编写共享项目,以确保它适用于多个平台 - 这也会导致重构 #ifs not active 时出现一些问题。

但我有一种直觉,将这段代码放到共享类中是不对的。如果适用于 Windows、Android 和 IOS 移动平台的代码使用共享项目而不是 PCL - 这意味着我们在共享项目中使用#ifs,而不是在特定平台项目中编写特定于平台的代码。

这是试图通过#ifs 支持非PCL 项目,并使共享代码更复杂且更难维护。这不应该是 Xamarin 为改进 .NET PCL 代码库而要做的工作吗?

这也意味着我们将特定于平台的功能放在共享项目中,而不是特定于平台的项目中 - 即从平台项目本身隐藏特定平台的复杂性 - 这在架构方面感觉不对。

我是对的(在这种情况下,我与 Xamarin 文档有冲突)还是我遗漏了什么?

【问题讨论】:

    标签: android .net mono xamarin portable-class-library


    【解决方案1】:

    两者都有自己的位置。例如,您可以将一个接口放入 PCL 中,然后在共享代码中实现它,前提是该实现具有相当数量的共享代码。

    我也不喜欢编译器标志,我更喜欢使用部分类。通过这种方式,您可以避免大多数甚至全部编译器标志。 Class1.cs 将进入共享项目,其余的将进入他们的平台特定项目。

    Class1.cs
    Class1.ios.cs
    Class1.android.cs
    Class1.wp8.cs
    

    【讨论】:

    • 部分课程! +1,...我可以在#ifdefs#和使用的#ifdefs#之间重新编写方法...但不是在逻辑上,它触发了我最糟糕的ocd。 :)
    【解决方案2】:

    他们都有自己的位置。如果您的代码完全可移植,我建议您使用 PCL。如果您需要使用特定于平台的 API,那么您可以使用 PCL 使用各种技术(通常涉及为功能创建可移植抽象)来实现,但如果这是一个孤立的案例,有时使用 #if 会更简单。

    有关优缺点的一般列表,请参阅我对PCLs versus linked files 问题的回答。共享项目类似于链接文件,但没有一些工具缺点。

    【讨论】:

      【解决方案3】:

      我的印象是,他们在共享库的好处下列出了编译器指令,仅仅是因为这是 PCL 不支持的功能。

      您不应将其视为 Xamarin 的鼓励,因为您和 Xamarin 都知道这些缺点。

      所以“要聪明”。

      【讨论】:

        【解决方案4】:

        我看到一个大型 Xamarin.iOS 和 Xamarin.Android 应用程序是为英国一家大型服装零售商构建的,该应用程序具有强大的 MVVM,非常有效地使用共享库和部分类。只有几个非常具体的场景需要我们使用 IFDEF。从那次经验来看,我通常会默认走这条路。

        话虽如此,但值得注意的是 .NET 标准 2.0 即将到来,这可能会使这场辩论不再是一个常见问题,因为它带来了自己的方法(与 PCL 相似但实际上完全不同)...https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多