我需要一个WP8项目和一个Android项目。到目前为止,我只看到一个名为Core的PCL,它链接到所有平台项目。问题是,我有平台特定的引用,我需要包括,具体取决于平台。我怎么处理这个?
我也见过这个:https://github.com/Redth/WshLst。该项目没有PCL并使用克隆项目。
我应该走哪条路?
答案 0 :(得分:2)
您可以通过两种方式共享代码。 PCL方法和使用文件链接(克隆)。
通过文件链接,您通常使用#if
指令来指定核心中的平台特定功能。像:
#if MONOANDROID
var androidGlobal = this.GetService<Cirrious.MvvmCross.Droid.Interfaces.IMvxAndroidGlobals>();
_geo = new Geolocator(androidGlobal.ApplicationContext);
#else
_geo = new Geolocator();
#endif
使用PCL项目,您通常会创建一个界面,然后创建单独的平台特定实现。
所以你的PCL核心项目可能有ILocationWatcher
。然后,您可以在每个平台项目中创建WinPhone.LocationWatcher
和Droid.LocationWatcher
。
通常你会使用某种控制反转(IoC)容器在启动时注册patform特定类型。然后你的Core项目将获得一个实例,通过依赖注入或通过IoC容器解析。您的核心PCL将严格针对接口编程,而不必担心具体实现。
这就是MvvmCross插件的工作方式。几乎所有的插件都带有核心接口和特定于平台的实现。
答案 1 :(得分:2)
您应该选择哪种方式取决于您的应用和您的需求。
可以使用服务位置和插件技术将平台特定资源注入PCL:
或者,您可以将共享代码用于部分类#if
等
在这个出色的答案中讨论了这两种方法的优点和缺点 - What is the advantage of using portable class libraries instead of using "Add as Link"?