【问题标题】:How to make Parse work with Xamarin's PCL project and MvvmCross?如何使 Parse 与 Xamarin 的 PCL 项目和 MvvmCross 一起工作?
【发布时间】:2015-02-11 15:14:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# parsing xamarin mvvmcross


    【解决方案1】:

    这里有几个想法:

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

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

    问题:我使用共享项目而不是 PCL 来存放我的 Xamarin.Forms 和 Parse 代码。 Parse 代码工作得很好,但是当我尝试在 XAML 的 ContentPage 中使用我自己的自定义 ContentView 时遇到了问题。我想要一个解决方案,它可以让我的自定义 ContentView 和我的 Parse 代码一样工作——两者都来自同一个项目。

    解决方案:我已切换到现在将我的 Xamarin.Forms 和 Parse 代码存放在 PCL 中。但有一个小问题。在我解释这个问题之前,只需要知道它确实可以在没有 Parse 代码重复的情况下工作(除了每个平台特定项目中的一行 Parse 初始化代码)。

    有什么问题?问题是,在您的可移植类库中,您必须根据编译的内容手动换入和换出 Parse.iOS.dll 或 Parse.Android.dll在当时。

    它会增加文件大小吗? 不会。我使用共享项目(它使用平台项目对 Parse dll 的引用)与可移植类库(你有在平台的项目和 PCL 中添加对 dll 的引用)并发现这样做不会增加应用程序文件的大小。

    以下是目前为我工作的项目结构(为保密起见,项目名称已重命名)。 (仅供参考:我正在为 Mac 使用 Xamarin。)

    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时,我发现如果我在References菜单下右键单击DLL,然后单击Delete,就会导致我的项目中出现iOS项目将不再编译,因为它仍在寻找 Parse.Android.dll,反之亦然。我尝试清理解决方案,从解决方案的文件系统中删除 bin 和 obj 文件夹,但无济于事。我通过这样做让它再次工作:右键单击引用,单击编辑引用,然后取消选中一个 Parse DLL 并选中另一个框。但是,在那之后,我再次尝试了“删除”方法,编译没有问题。谁知道呢,也许这个问题会再次出现在我面前。

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

    我希望这会有所帮助。如果您比目前正在做的更喜欢这些想法中的任何一个,请接受这个作为答案,并让我们知道您决定采取哪条路线。

    【讨论】:

      【解决方案2】:

      为 Mvvmcross 创建 Parse 插件不是最好的方法吗?在哪里定义要使用的接口。

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

      【讨论】:

      • 好主意,但它仍然会导致重复代码,因为两个平台的代码完全相同。两个平台的唯一区别就是需要引用的dll。
      • 是的,但是您可以创建类似于 SQLite 插件的东西... Core 中用于所有平台的共享代码,它们作为链接添加到特定平台插件中
      【解决方案3】:

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

      【讨论】:

      • 请注意,在 iOS 上,这样做时,iOS 中需要包含 Mono.Android 运行时,导致应用程序大小巨大!也许这毕竟不是最好的方法:(
      • 你有没有找到一种很好的方法让 Parse 在 iOS 和 Android 上都可以工作,而不需要复制 Parse 逻辑,也不会使 iOS 应用变得庞大?
      • @AnthonyTietjen 我们最终将需要与 Parse 交互的代码放入特定平台项目的类中。这些类实现了 Core 中定义的接口。因此,假设我想查询位于 Core 的 ViewModel 的总销售额,我将调用 await ISomeParse.GetNumberOfSales()。 Droid/iOS 类中的代码是相同的(命名空间除外),并且它们实现了相同的接口。所以不幸的是,其中涉及代码重复,但它工作得很好。当您要更新代码时,请确保其他项目中的其他副本已更新。
      • @AnthonyTietjen 此外,在每个平台特定的项目中,引用各自的 Parse dll - 适用于 iOS 的 Parse.Touch.dll,适用于 Droid 的 Parse.Droid.dll。如果您找到更好的方法,请告诉我们:)
      • SharpMobileCode 在此 URL 解释了一个更好的解决方案:stackoverflow.com/questions/30228621/parse-and-xamarin(请务必查看我在他的回复中添加的内容。)我已经确认该解决方案适用于我的 iOS 项目,具有共享类图书馆。由于我现在没有适用于 Xamarin.Forms 的 Android Xamarin 许可证,因此我尚未确认它是否适用于 Android,但我非常希望它能够正常工作。
      猜你喜欢
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2023-03-04
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多