PCL或克隆项目(MvvmCross)

时间:2014-02-16 13:13:35

标签: android windows-phone-8 xamarin mvvmcross azure-mobile-services

我需要一个WP8项目和一个Android项目。到目前为止,我只看到一个名为Core的PCL,它链接到所有平台项目。问题是,我有平台特定的引用,我需要包括,具体取决于平台。我怎么处理这个?

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

我应该走哪条路?

2 个答案:

答案 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.LocationWatcherDroid.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"?