繁体   English   中英

如何使解析与Xamarin的PCL项目和MvvmCross一起使用?

[英]How to make Parse work with Xamarin's PCL project and MvvmCross?

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

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

问题是,将解析服务与Xamarin和MvvmCross跨平台应用程序集成的最佳方法是什么? 我以为很多人会这样做,但是找不到参考/示例。 绝对不应该在iOS和Android项目中重复执行代码。

这里有一些想法:

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

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

问题:我使用共享项目而不是PCL来存放我的Xamarin.Forms和Parse代码。 解析代码工作正常,但是在XAML的ContentPage中尝试使用自己的自定义ContentView时遇到问题。 我想要一个解决方案,使我的自定义ContentView以及我的Parse代码都可以在同一个项目中工作。

解决方案:我现在改用PCL存放Xamarin.Forms和Parse代码。 但是有一个小问题。 在我解释这个问题之前,只知道它确实可以使用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文件夹无济于事。 通过执行以下操作,我使它再次起作用:右键单击“引用”,单击“编辑引用”,然后取消选中一个Parse DLL,然后选中另一个。 但是,此后,我再次尝试了“删除”方法,并且在编译时没有问题。 谁知道,也许这个问题会再次为我解决。

这会变得烦人吗? 根据您在平台之间切换的频率,DLL的手动交换可能会或可能不会很烦人。 不管这有多烦人,它都比拥有重复的代码更糟。 (也许此交换过程可以使用脚本自动执行?我认为您必须卸载PCL并重新加载它,尽管如果您使用脚本修改.csproj。有人可以挑战吗?或者也许有办法根据要编译的平台对DLL进行条件引用。有人吗?

我希望这有帮助。 如果您比目前正在做的事情更喜欢这些想法,请接受此作为答案,并让我们知道您决定采取的路线。

创建Mvvmcross的解析插件不是最好的方法吗? 在其中定义要使用的接口。

并且在每个平台特定的库中,您引用解析dll并调用该方法。 因此,在您的核心项目中,您应该能够调用IParse.methods ...

因此,通过在所有3个项目(Core,iOS和Android)中都引用Parse.Android.dll,我在Android和iOS上都能正常工作。 是的,这听起来很奇怪,但这就是我的工作。 只需转到“ 解析”下载页面,然后在“ Android”部分下下载Xamarin SDK。 它也能创造奇迹! 没有代码重复,没有混乱:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM