【问题标题】:Best approach for calling a web service (or similar) with MvvmCross使用 MvvmCross 调用 Web 服务(或类似服务)的最佳方法
【发布时间】:2016-09-20 10:00:48
【问题描述】:

我最近一直在思考这个问题,我希望比我更了解 MvvmCross 的人能对此有所了解。鉴于每个移动平台之间的细微差别,可能有几个不同的因素会影响这个问题。但是对于这种情况,我们假设我们想要跨平台解决方案的最佳方法。

假设我们有一个基本的 View 和一个 ViewModel 类设置。这是一个 iOS 示例。

查看

public partial class FirstView : MvxViewController<FirstViewModel>
{
    public FirstView(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        Request = new MvxViewModelInstanceRequest(FirstViewModel.NewInstance());
        base.ViewDidLoad();
    }
}

查看模型

public class FirstViewModel : MvxViewModel
{
    public static FirstViewModel NewInstance()
    {
        return Mvx.IocConstruct<FirstViewModel>();
    }

    public FirstViewModel()
    {
    }
}

现在在加载此视图时或在创建视图之前的某个时间点,我们希望使用我们使用依赖注入注入的服务从 Web 获取一些数据;因为视图的显示取决于该数据。这就是问题所在。从平台的角度来看,在 MvvmCross 生命周期中,此时最适合在服务中调用 web fetch 函数。

关于平台,我假设我们应该在视图加载后执行此操作。因为如果获取的数据不是简单数据类型,那么在 Android 上使用会很不方便,因为由于活动之间的序列化,必须将数据保存到磁盘并在导航后检索它。

所以假设我们在视图加载过程中调用了 web fetch。 MvvmCross 架构中最好的地方在哪里触发它,最接近设计范式。例如视图模型。是否有人可以推荐在内部调用它的任何生命周期方法。类似于 Start 方法,在创建视图模型后调用。

【问题讨论】:

    标签: c# xamarin mvvmcross


    【解决方案1】:

    首先,我不明白您为什么不让平台本身实例化并执行 ViewModel 生命周期,而不是使用 Mvx.IocConstruct 创建 ViewModel 的新实例。该方法不会调用 ViewModel 生命周期,也不会在 ViewModel 上调用 InitStart

    如果您让平台为您执行此操作,首先将使用您在使用 ShowViewModel&lt;T&gt;(args) 时设置的参数调用 Init 方法。

    ViewDidLoad 调用Start 方法时将随后被调用。

    这为您提供了两个地方来调用您在 ViewModel 的 ctor 中注入的服务。

    如果您想更好地控制何时下载数据,您可以创建一些 ICommand,您可以在任何 ViewController 生命周期方法中在 ViewModel 上调用它们。这可能在 ViewWillDisappear/ViewDidDisappear 方法中,或者您可以获取数据。

    有很多方法可以做到这一点。最后,这完全取决于您,您不可能知道用户何时决定更改为另一个视图。但是,您可以做出合格的猜测并尝试在用户真正需要之前获取数据。

    有一篇不错的文章给你read here, by Rob Gibbens on how you could do Resilient network services。它描述了如何根据用户正在做的事情推测性地获取资源,这样就可以在用户进入视图时看到一些东西。这可能是缓存数据或您在显示缓存版本后获取的新数据。

    无论如何,我建议您停止使用 Mvx.IocConstruct 加载 ViewModel,让 MvvmCross 为您处理此问题,以便调用生命周期方法。

    【讨论】:

    • 是的,事实证明这是我们通过在办公室共享代码而养成的一种不好的做法。我想这就是你不编写自己的代码所付出的代价。谢谢你的文章,看起来很有信息量。给了我一些思考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多