如何让Parse与Xamarin的PCL项目和MvvmCross合作?

时间:2015-02-11 15:14:01

标签: c# parsing xamarin mvvmcross

在尝试将Parse与跨平台Xamarin应用集成时,我遇到了很多问题。起初,我能够使用Xamarin和MvvmCross创建Android应用程序并与Parse服务集成(通过在Xamarin中添加Parse组件来完成)。当开发iOS应用程序时,我有问题将Parse依赖重构为Core PCL项目,因为Parse目前不支持Xamarin PCL项目。因此,没有可以添加到PCL项目的Parse NuGet包或Xamarin组件。我可以轻松地将Parse组件分别添加到iOS项目和Android项目中,但这将需要在两个项目中进行大量代码重复。

我已经读过在Core项目中引用Parse.dll和Parse.NetFx45.dll使我能够在Core项目中使用Parse调用。我这样做了,并且能够成功编译所有内容。但是,当我尝试使用ParseClient.Initialize("ApplicationID", "DotNetKey");在Core项目中初始化Parse时,我在运行时得到TypeInitializationException

问题是,将Parse服务与Xamarin& amp; s集成的最佳方法是什么? MvvmCross跨平台应用?我想象很多人会做到这一点,但无法找到参考/例子。在iOS和Android项目中复制代码绝对不应该是最佳选择。

3 个答案:

答案 0 :(得分:3)

以下是一些想法:

首先,如果您当前正在手动将Parse代码更改从项目复制到项目,则可以通过编写运行的脚本来加速该过程,该脚本将某些文件克隆到另一个项目。或者你可以编写一个grunt脚本,当它检测到更改时自动复制文件。

现在,这是另一种将Parse代码存储在一个项目中但跨平台共享的方法:

问题:我使用共享项目而不是PCL来存放我的Xamarin.Forms和Parse代码。 Parse代码运行得很好,但是当我尝试在XAML的ContentPage中使用我自己的自定义ContentView时遇到了一个问题。我想要一个允许我的自定义ContentView和我的Parse代码一起工作的解决方案 - 来自同一个项目。

解决方案:我已经切换到现在在PCL中存放我的Xamarin.Forms和Parse代码。但是有一个小问题。在我解释catch之前,只知道它确实可以使用NO Parse代码重复(除了每个平台的特定项目中的一行Parse初始化代码)。

有什么问题?问题是,在您的便携式类库中,您必须手动交换进出Parse.iOS.dll或Parse.Android.dll,具体取决于您正在编译的内容因为当时。

是否会增加文件大小?不是。我使用共享项目(使用平台项目引用Parse dll)与我的应用程序进行了测试,而不是使用可移植类库(您可以使用它)在平台的项目和PCL中添加对dll的引用,并发现这样做不会增加应用程序文件的大小。

以下是目前正在为我工​​作的项目结构(项目名称已重新命名为机密性)。 (仅供参考:我正在使用Xamarin for Mac。)

MyProject.iOS
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
MyProject.Android
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
Portable Class Library
 - Parse Code
 - Xamarin Forms Code
 - Reference to either Parse.iOS.dll or Parse.Android.dll

重要:当在PCL中交换DLL时,我发现如果我右键单击“引用”菜单下的DLL,然后单击“删除”,则会在我的iOS项目中导致问题项目将不再编译,因为它仍在寻找Parse.Android.dll,反之亦然。我尝试清理解决方案,从解决方案的文件系统中删除bin和obj文件夹无济于事。我通过这样做再次使用它:右键单击引用,单击编辑引用,然后取消选中一个解析DLL并选中另一个的复选框。然而,在那之后,我再次尝试了“删除”方法并且没有编译问题。谁知道,也许这个问题会再次出现在我身上。

这不会让人烦恼吗?根据您在平台之间切换的频率,DLL的手动交换可能会或可能不会令人讨厌。无论多么烦人,它都不会比重复代码更糟糕。 (也许这个交换过程可以通过脚本自动完成?我认为你必须卸载PCL并重新加载它,如果你用脚本修改.csproj。那里有人接受挑战吗?或者也许有办法根据它正在编译的平台对DLL进行条件引用。想一想谁?)

我希望这会有所帮助。如果你比这些想法更喜欢这些想法,请接受这个作为答案,让我们知道你决定走哪条路。

答案 1 :(得分:1)

不是最好的方法,为Mvvmcross创建一个Parse插件吗?您定义要使用的接口的位置。

在每个平台特定的库中,您引用解析dll并调用该方法。所以在你的Core项目中你应该能够调用IParse.methods ......

答案 2 :(得分:0)

所以通过在所有3个项目(Core,iOS和Android)中引用Parse.Android.dll,我在Android和iOS上都运行良好。是的,听起来很奇怪,但这对我有用。只需转到Parse download page并在Android部分下载Xamarin SDK即可。它也创造奇迹!没有代码重复,没有混乱:)