我需要一个WP8项目和一个Android项目。到目前为止,我只看到一个名为Core的PCL,它链接到所有平台项目。问题是,我有平台特定的参考,我需要包括,取决于平台。我该如何处理?PCL或克隆项目(MvvmCross)
我也看到了这个:https://github.com/Redth/WshLst。该项目没有PCL并使用克隆的项目。
我该走哪条路?
我需要一个WP8项目和一个Android项目。到目前为止,我只看到一个名为Core的PCL,它链接到所有平台项目。问题是,我有平台特定的参考,我需要包括,取决于平台。我该如何处理?PCL或克隆项目(MvvmCross)
我也看到了这个:https://github.com/Redth/WshLst。该项目没有PCL并使用克隆的项目。
我该走哪条路?
有两种方法可以在您声明的情况下共享代码。 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)容器在启动时注册特定于类型的特定类型。然后你的Core项目会通过依赖注入或者通过IoC容器解析得到一个实例。你的核心PCL将严格按照接口进行编程,而不必担心具体的实现。
这就是MvvmCross插件的工作原理。几乎所有的插件都有一个核心接口和一个平台特定的实现。
你应该走哪条路取决于你的应用和你的需求。
平台特定的资源可以使用服务定位和插件技术来注入PCL:
替代地31,可以使用共享具有部分类的代码,#if
等
在这个优秀的答案中讨论了2种方法的优缺点 - What is the advantage of using portable class libraries instead of using "Add as Link"?