如何在ViewModel和Model之间进行通信异步调用

时间:2012-06-28 10:15:33

标签: c# silverlight mvvm-light

我正在使用MVVMLight编写MVVM Silverlight应用程序。我问自己,在Model和ViewModel之间进行通信的最佳方式是什么。我的模型具有来自Web服务的异步调用,我不知道获取返回值的最佳方法是什么。

我试过这个:

public static void ModifySomething(Something s)
{
    var c = MyServiceFactory.GetService();
    c.ModifySomethingCompleted += (sender, e) =>
    {
        if (e.Error != null)
        {
            Messenger.Default.Send(new XyzException(e.Error, "ModifyError"));
            return;
        }
        Messenger.Default.Send(e.Result, "ModifyOk");
    };
    c.ModifySomethingAsync(s);
}

和此:

public static void ModifySomething(Something s, Action<Something, Exception> callback)
{
    var c = ServiceFactory.RecupererService();
    c.ModifySomethingCompleted += (sender, e) =>
    {
        if (callback != null) callback(e.Result, e.Error);
    };
    c.ModifySomethingAsync(s);
}

两个都有效,在第一个例子中我使用的是MvvmLight Messenger,所以我必须为我的模型的每个方法注册一个字符串消息列表,然后任何ViewModel都可以挂钩到这个动作。

在第二个例子中,我使用经典方法发送一个在Completed事件上触发的回调。只触发了一个回调,但代码更具可读性。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我想说:取决于!认真!这取决于

  • 您想要完成的任务(良好的设计,可扩展性等)
  • 你以前做什么
  • 您希望的目标环境想要什么
  • 有多少人参与该项目
  • ESTD。 1.000项以上

我喜欢第一种方法,因为它给了我类似服务总线的行为,如果我愿意,我可以使用配置。第二个在类型安全方面更具体,因为您可能会在发布消息时出错。