我想弄清楚哪个是更适合我们项目的方式。
Xamarin的PCL图书馆或共享项目。
在Xamarin documentation link here中,它说经验法则是在我们不共享图书馆时选择共享项目。共享项目可以使用#if来编写,以确保它可以与多个平台一起使用 - 这也会导致重构#ifs无效的一些问题。
然而,我有一种直觉,认为将此代码放入共享类是不对的。如果Windows,Android和IOS移动平台可用的代码使用共享项目而不是PCL - 这意味着我们在共享项目中使用#ifs而不是在特定于平台的项目中编写特定于平台的代码。
这是试图通过#ifs支持非PCL项目,并使共享代码更复杂,更难维护。难道这不是Xamarin要改进.NET PCL代码库的工作吗?
这也意味着我们将平台特定功能放在共享项目而不是平台特定项目中 - 即从平台项目本身隐藏特定平台的复杂性 - 这在架构方面感觉不对。
我是对的(在这种情况下,我与Xamarin文档相冲突)还是我错过了什么?
答案 0 :(得分:20)
两者都有自己的位置。例如,您可以将接口放入PCL,然后在共享代码中实现它,如果实现具有相当数量的共享代码。
我也不喜欢编译器标志,我更喜欢使用部分类。这样您就可以避免大部分甚至全部编译器标志。 Class1.cs将进入共享项目,其余的将进入他们的平台特定项目。
Class1.cs
Class1.ios.cs
Class1.android.cs
Class1.wp8.cs
答案 1 :(得分:6)
他们都有自己的位置。如果您的代码完全可移植,我建议您使用PCL。如果您需要使用特定于平台的API,那么您可以使用各种技术(通常涉及为功能创建可移植的抽象)来使用PCL,但如果它是一个孤立的情况,有时只使用#if更简单。 / p>
有关优缺点的一般列表,请参阅我对PCLs versus linked files上的问题的回答。共享项目与链接文件类似,但没有一些工具缺点。
答案 2 :(得分:2)
我的印象是,他们在共享库的好处下列出了编译器指令,仅仅因为它是PCL不支持的功能。
你不应该把这视为Xamarin的鼓励,因为你和Xamarin都知道这些缺点。
所以"聪明"。
答案 3 :(得分:0)
我见过一个大型的Xamarin.iOS& Xamarin.Android应用程序是为英国主要服装零售商构建的,具有强大的MVVM,使用共享库和部分类非常有效。只有几个我们需要使用IFDEF的非常具体的场景。从那次经历来看,我经常默认走这条路。
话虽如此,值得注意的是.NET标准2.0即将推出,这可能会使这场辩论成为一个常见问题,因为它带来了自己的方法(类似但与PCL完全不同)...... {{3 }}