【问题标题】:Design pattern for between ViewModel and Service / ModelViewModel 和 Service / Model 之间的设计模式
【发布时间】:2014-06-16 05:42:44
【问题描述】:

我是 MVVM 的新手,经过几周的学习,但我不太清楚 callbackViewModelModel 之间的行为。

假设我有一个视图模型从数据库中获取计算结果,GetCalculationA 使用回调,GetCalculationB 是返回值,但哪个更好,为什么?

ViewModel:
public void GetCalculationResultA()
{
    _service.PrepareStuff(e =>
        {
            if (e != null) errHandler(@"err in calculation");
            _service.GetParameterA((i1, e1) =>
            {
                if (e1 != null) errHandler(@"err in calculation");
                _service.GetParameterB((i2, e2) =>
                    {
                        if (e2 != null) errHandler(@"err in calculation");
                        _service.Calc(i1, i2, (r, e3) =>
                            {
                                if (e3 != null) errHandler(@"err in calculation");
                                ResultText = r.toString();
                            });
                    });
            });
        });
}

public void GetCalculationResultB()
{
    try
    {
        _service.PrepareStuff();
        int i1 = _service.GetParameterA();
        int i2 = _service.GetParameterB();
        ResultText = _service.Calc(i1, i2);
    }
    catch
    {
        errHandler(@"err in calculation")
    }
}

【问题讨论】:

    标签: c# mvvm model callback viewmodel


    【解决方案1】:

    对我来说,这看起来更像是关于异步方法调用的控制流主题。您绝对应该查看 C# 4.5 异步和等待模式以使用异步代码。 这有助于您在没有回调地狱的情况下构建代码。

    您还可以等待所有结果或多次操作的任何结果。

    //pseudo code from the top of my head
    var perperationTask = service.PrepareStuffAsync(parameter);  
    var parameterATask = service.GetParameterA(value1, value2);  
    var parameterBTask = service.GetParameterB(value2,value3);  
    
    await Task.WhenAll(settingsTask, reputationTask, activityTask);  
    
    PreperationSettings settings = perperationTask.Result;  
    int parameterAResult = parameterATask.Result;  
    int parameterBResult = parameterBTask.Result;
    
    await calulation = service.CalculateAsync(parameterAResult,parameterBResult);
    

    您应该能够将其包装在 try catch 块中并使用经典的错误处理。

    所以 async await 有助于简化异步编程...在此处阅读更多内容: 使用 Async 和 Await 进行异步编程 http://msdn.microsoft.com/en-us/library/hh191443.aspx 异步程序中的控制流 http://msdn.microsoft.com/en-us/library/hh873191.aspx

    HTH

    【讨论】:

      【解决方案2】:

      如果我理解正确,您的问题实际上是关于错误处理的。在大多数情况下,这通常只是 MVVM 模式的扩展——您将错误视为模型的一部分。根据您的场景以及您的应用打算如何显示错误,您可能有一个 View 可以绑定到的任意复杂的错误对象(或错误对象列表),并且可能有一个触发 UI 中弹出窗口的事件。

      如何调用存储库的确切机制完全取决于您的应用程序要求。我在我的应用程序中看到的两个主要模式是单个阻塞错误和非阻塞错误列表之间的区别。在我看来,方法 A 适合于一个非阻塞错误列表,而 B 适合于单个阻塞错误。

      【讨论】:

      • 感谢您的回答,很抱歉让您对我的问题感到困惑。我不太关心错误处理,但想知道任何更好的方法,而不是那些丑陋的call back
      猜你喜欢
      • 2011-01-06
      • 2018-06-03
      • 1970-01-01
      • 2013-11-04
      • 2012-03-19
      • 1970-01-01
      • 2015-05-10
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多