1

我需要一个WP8项目和一个Android项目。到目前为止,我只看到一个名为Core的PCL,它链接到所有平台项目。问题是,我有平台特定的参考,我需要包括,取决于平台。我该如何处理?PCL或克隆项目(MvvmCross)

我也看到了这个:https://github.com/Redth/WshLst。该项目没有PCL并使用克隆的项目。

我该走哪条路?

回答

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.LocationWatcherDroid.LocationWatcher

通常您会使用某种控制反转(IoC)容器在启动时注册特定于类型的特定类型。然后你的Core项目会通过依赖注入或者通过IoC容器解析得到一个实例。你的核心PCL将严格按照接口进行编程,而不必担心具体的实现。

这就是MvvmCross插件的工作原理。几乎所有的插件都有一个核心接口和一个平台特定的实现。

2

你应该走哪条路取决于你的应用和你的需求。

平台特定的资源可以使用服务定位和插件技术来注入PCL:

替代地31,可以使用共享具有部分类的代码,#if

在这个优秀的答案中讨论了2种方法的优缺点 - What is the advantage of using portable class libraries instead of using "Add as Link"?