Xamarin共享项目与便携式类库

27

我正在尝试找出对于我们的项目而言哪种方法更好。

PCL 库或 Xamarin 的共享项目。

Xamarin 文档链接中,它说选择共享项目还是 PCL 库的一个经验法则是当我们不想分享库时就选共享项目。共享项目可以使用 #if 写成多平台通用的代码 - 这也会导致一些重构 #ifs 不起作用的问题。

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

这样尝试通过 #ifs 来支持非 PCL 项,并使共享代码变得更加复杂和难以维护。这不应该是 Xamarin 改进 .NET PCL 代码库的工作吗?

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

我是对的吗(如果是,那么我与 Xamarin 文档相冲突)还是我漏掉了什么?

4个回答

20

两者都有它们的用处。比如,你可以把一个接口放在一个PCL中,然后在共享代码中实现它,如果这个实现有足够多的共享代码。

我也不喜欢编译器标志,我更倾向于使用部分类。这样,你就可以避免大部分甚至全部的编译器标志。Class1.cs将进入共享项目,其余部分将进入它们各自的平台特定项目。

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

1
部分类!+1,……我可以接受在#ifdefs#之间进行方法重写,并且在使用时进行#ifdefs#,但不能在逻辑中进行,这会触发我的强迫症状。 :) - Dan

6

两者都有其适用的场景。如果你的代码完全可移植,建议使用 PCL。如果需要使用特定于平台的 API,则可以使用 PCL 并使用各种技术(通常涉及为功能创建可移植抽象),但如果这是个孤立的情况,有时只需使用 #if 就更简单了。

有关优缺点的一般列表,请参见我在 PCL 与链接文件相比的优劣 中的回答。共享项目类似于链接文件,但没有一些工具的缺点。


2

我的印象是,他们将编译器指令列在共享库的优点下,只是因为这是PCL不支持的功能。

你不应该将此视为Xamarin的鼓励,因为你和Xamarin都知道其缺点。

所以,“要聪明点”。


0

我曾经看到一个为英国一家大型服装零售商构建的大型Xamarin.iOS和Xamarin.Android应用程序,它使用共享库和部分类非常有效地实现了强大的MVVM。只有在极少数特定情况下,我们需要使用IFDEFs。从那个经验中,我通常会默认选择这种方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接