【问题标题】:How to make communicate asynchronous calls between ViewModel and Model如何在 ViewModel 和 Model 之间进行通信异步调用
【发布时间】:2012-06-28 10:15:32
【问题描述】:

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

我试过了:

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 事件上触发的回调。只触发了一个回调,但代码更具可读性。

最好的方法是什么?

【问题讨论】:

  • 您的异步调用是如何进行的?
  • 异步方法来自服务引用(代码是从 wsdl 文件自动生成的),调用来自模型部分中的静态方法

标签: c# silverlight mvvm-light


【解决方案1】:

我会说:取决于!严重地!这取决于

  • 您希望完成的工作(良好的设计、可扩展性等)
  • 你习惯做的事情
  • 您想要的目标环境需要什么
  • 有多少人在做这个项目
  • 估计。还有 1.000 件商品

我喜欢第一种方法,因为它为我提供了类似服务总线的行为,并且我可以根据需要使用配置。第二个在类型安全方面更具体,因为您可能会在发布消息时出错。

【讨论】:

  • 是的,这也是我的第一种方法,我使用常量来匹配消息,但是应用程序增长得越多,我收到的消息就越多......我敢肯定它不是糟糕的代码设计。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多