3

我考虑使用MvvmCross将我的应用程序移植到多个平台。我检查了一些使用 MvvmCross 的项目,该框架看起来很有前途且易于采用。我想澄清一些概念,以确保我能正确进行移植。

  1. 据我了解,cross-platform业务逻辑应该在通过RegisterServiceInstance调用可用的服务中实现。

  2. 特定于平台的功能通过插件公开。我应该努力使用MvvmCross插件,但如果我找不到提供我需要的功能的插件,我可以自己编写。我应该如何规划自定义插件的粒度?我应该避免在那里有任何业务逻辑而只放置特定于平台的东西吗?如果使用标准Mvvm插件需要在我的应用程序中进行大量代码更改,我是否仍然应该这样做以避免制作我自己的插件,或者我可以在插件设计决策中自由?

  3. 最后,我还没有完全弄清楚所谓的应用程序对象的用途,特别是为什么它们使用这个长后缀("ApplicationObject")。什么是合格的应用对象,为什么建议装饰它的名字?

提前致谢。

4

1 回答 1

6

一般来说.... Mvvmcross 实际上的目标是成为一个相当轻量级的框架 - 它希望更接近 mvvmlight 而不是棱镜......它的目的是让您将 mvvm 用于视图和视图模型 - 然后您如何编写您的业务逻辑(midels 和服务)真的取决于你。

话虽如此,对于我编写的示例,我通常使用 IoC 和插件 - 所以这是“我的实践” - 这是否是“最佳实践”绝对值得商榷 :)

  1. 据我了解,跨平台业务逻辑应该在通过 RegisterServiceInstance 调用可用的服务中实现。

是的,RegisterServiceInstance、RegisterServiceType 和 GetService 一起提供了一个简单的 IoC 框架。

在我的应用程序中,我通常选择在“服务”层中实现业务逻辑,应用程序在启动期间向 IoC 注册,虚拟机在需要时使用该层。

如果您想直接在 vm 中对业务逻辑进行编码,或者如果您想使用服务的直接编码(而不是 IoC),那么您完全可以这样做。

  1. 特定于平台的功能通过插件公开。我应该努力使用 MvvmCross 插件,但如果我找不到提供我需要的功能的插件,我可以自己编写。我应该如何规划自定义插件的粒度?我应该避免在那里有任何业务逻辑而只放置特定于平台的东西吗?如果使用标准 Mvvm 插件需要在我的应用程序中进行大的代码更改,我是否仍然应该这样做以避免制作我自己的插件,或者我可以在插件设计决策中自由?

是的,要自由!

插件只是使用 PCL 进行 IoC 的一种正式方式。

在 mvx 树中,插件非常小且具有针对性,因为它们被设计为在许多项目中重用。

在 mvx 树中,插件不包含业务逻辑,因为 mvx 是通用的 - 它不了解您的业务。

如果您想为您的应用程序编写一个插件,注册 50 个接口实现,其中许多是业务对象,那么“是的,请做” - 围绕您的业务需求构建您的代码。

最后,请注意插件是可选的——如果你有一些特定于平台的代码,你总能找到另一种方式将它注入你的虚拟机——例如,你的视图可以注入实现,或者你可以编写使用文件或程序集链接的非 PCL 代码为每个应用平台选择正确的实现。

  1. 最后,我还没有完全弄清楚所谓的应用程序对象的用途,特别是为什么它们使用这个长后缀(“ApplicationObject”)。什么是合格的应用对象,为什么建议装饰它的名字

我同意这个名字并不完美 - 但我仍然想不出更好的名字。

MvxNotifyPropertyChanged 对象了解 Ui 线程并提供 inpc 实现

MvxApplicationObject 对象从 MvxNotifyPropertyChanged 继承,但也可以访问导航方法。

MvxViewModel 对象继承自 MvxApplicationObject 并被设计用于视图。

我现在唯一经常使用 MvxApplicationObject 的地方是起始对象——启动应用程序中第一个视图模型的“事物”。我通常将其称为 StartApplicationObject,因为它描述了它是什么。如果你想给它起别的名字,那么请这样做——我保证这不会对任何小猫造成任何伤害。

旁注:在第一个 mvx 项目中,开始对象最初继承自 MvxViewModel ...但在代码审查中被抓住并批评...在 ui 应用程序中做一些事情 - 它是一个......” - 那就是 MvxApplicationObject 诞生的时候......

如果你后来发现你有其他需要导航的对象,但不是视图模型,那么这个基类也适合你。否则,不要觉得你必须使用它......


总之...

从您的问题来看,听起来您已经阅读了示例,并且对我通常如何构建我的应用程序的核心部分有了很好的理解。

我唯一要强调的是我要保持灵活性——我不相信有一个最佳实践,大多数新项目都会带来新的独特挑战,而且我通常会在每个项目中学习和尝试新事物。

希望有帮助

斯图尔特

于 2013-01-14T09:47:39.170 回答