我们的应用程序有几个不作为 PCL 库提供的依赖项(例如 RestSharp、Websocket4Net、Reactive Extensions),但可用于我们计划针对的每个平台。在 MvvmCross 中处理这种情况的最佳方法是什么?什么是最简单的?
2 回答
有多种方法可以解决这个问题。
如果问题真的很大,你可以放弃 PCL 的方法,而使用多平台特定的类库。这些库可以引用 MvvmCross PCL 和 RestSharp 的平台特定版本等。有关此方面的优缺点的讨论,请参阅 -使用可移植类库而不是使用“添加为链接”有什么优势?
一般来说,如果我必须包含一个非常大的 Legacy 库(例如,一个客户有一个与 3 个单独的 WCF 服务通信的大型业务逻辑库......),我现在只采用这种文件链接方法。
您提到的一些库可能已经有 PCL 端口和/或替代品 - 例如
- Reactive Extensions 有一个官方的 PCL 端口 - 请参阅http://blogs.msdn.com/b/rxteam/archive/2013/02/06/rx-2-1-is-here.aspx
- 对于简单的休息调用,我们现在已经开始在网络插件中包含一些功能 - 请参阅https://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest(警告 - 字母代码!)
许多开源作者现在都提供 PCL 版本 - 所以检查一下。
您通常可以将本机库抽象到接口后面,然后可以在运行时注入该库的正确版本。这就是插件在 MvvmCross 中所做的事情
您可以查看https://github.com/slodge/MvvmCross/tree/v3/Plugins/中构建了多少插件
此示例中有一个非常简单的插件 - https://github.com/slodge/MvvmCross-Tutorials/tree/master/GoodVibrations
您可以使用的另一种方法是提供“参考程序集”——这些是仅包含类型和接口签名的 PCL 程序集(即它们仅提供
NotImplementedException
实现)。您的 PCL 项目链接到这些程序集,而您的 UI 项目链接到真正的程序集。在构建时,您的 PCL 核心将针对签名进行构建,但 MSBuild/XBuild 将确保真正引入正确的本机库。我在实践中没有使用过最后一种技术。我更喜欢接口路由,因为它可以带来更好的架构。但是,这种技术用于当前的 MvvmCross Nuget 包中 - 所以我知道它有效。
我们的测试员 Daniel 写了一篇关于如何解决这类问题的博文。