我们的应用程序有几个不能作为 PCL 库使用的依赖项(例如 RestSharp、Websocket4Net、Reactive Extensions),但可用于我们计划面向的每个平台。在 MvvmCross 中处理这种情况的最佳方法是什么?什么最简单?
最佳答案
有多种方法可以解决这个问题。
如果问题真的很大,您可以放弃 PCL 方法,并使用多个平台特定的类库。这些库可以引用 MvvmCross PCL 和平台特定版本的 RestSharp 等。有关其优缺点的讨论,请参见 - What is the advantage of using portable class libraries instead of using "Add as Link"?
一般来说,如果我必须包含一个非常大的遗留库(例如,一个客户有一个与 3 个独立的 WCF 服务对话的大型业务逻辑库......),我现在只采用这种文件链接方法......)
您提到的一些库可能已经有 PCL 端口和/或替代品 - 例如
- Reactive Extensions 有一个官方的 PCL 端口 - 参见 http://blogs.msdn.com/b/rxteam/archive/2013/02/06/rx-2-1-is-here.aspx
- 对于简单的 rest 调用,我们现在已经开始在网络插件中包含一些功能 - 请参阅 https://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest (警告 - 字母代码!)
许多开源作者现在都提供 PCL 版本 - 请查看。
您通常可以将原生库抽象到接口(interface)后面,然后您可以在运行时注入(inject)该库的正确版本。这就是插件在 MvvmCross 中所做的事情
你可以看到https://github.com/slodge/MvvmCross/tree/v3/Plugins/中内置了多少插件
此示例中有一个非常简单的插件 - https://github.com/slodge/MvvmCross-Tutorials/tree/master/GoodVibrations
您可以使用的另一种方法是提供“引用程序集”——这些是仅包含类型和接口(interface)签名的 PCL 程序集(即它们仅提供
NotImplementedException
实现)。您的 PCL 项目链接到这些程序集,而您的 UI 项目链接到实际程序集。在构建时,您的 PCL 核心将根据签名进行构建,但 MSBuild/XBuild 将确保实际引入正确的 native 库。我没有在实践中使用过这最后一种技术。我更喜欢接口(interface)路由,因为它可以带来更好的架构。但是,当前的 MvvmCross Nuget 包中使用了此技术 - 所以我知道它有效。
关于dependencies - 非 PCL 依赖 w/MvvmCross,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514816/