ViewModel和Service / Model之间的设计模式

时间:2014-04-30 03:11:30

标签: c# mvvm model callback viewmodel

经过几周的学习后,我是MVVM的新手,但我不确定callbackViewModel之间的Model行为。

假设我有一个视图模型来从DB获取计算结果,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")
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

对我而言,这看起来像是异步方法调用的控制流主题。您一定要查看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