抛出异常或返回任何结果?

时间:2017-06-27 16:50:00

标签: c# wpf mvvm

我使用MVVM模式编写WPF应用程序并且陷入两难境地。在ViewModel中,我有BusinessLogic实例。这是功能:

public async Task StartService(string password = null)
    {
        if (!string.IsNullOrEmpty(password))
        {
            _serviceController.Start(new[] {password});
            await _serviceController.WaitForStatusAsync(ServiceControllerStatus.Running);
        }
        else if (TokenAccessFileExists())
        {
            _serviceController.Start();
            await _serviceController.WaitForStatusAsync(ServiceControllerStatus.Running);
        }
        else
            throw new Exception("TADA");

    }

从VM调用此函数。但如果条件不正确,我不知道该怎么做。我应该抛出expcetion并在VM中捕获它或返回自定义结果?

非常感谢您的回答

修改 更清楚: 我问,哪种方法更方便:从服务层抛出异常并在VM中处理它,或者将某种类型的结果返回给VM。

1 个答案:

答案 0 :(得分:1)

两个选项都是正确的。

您可以简单地抛出异常,并在调用者中处理它。

或者您可以创建这样的结构来描述操作的成功/失败:

class StartServiceResult
{
    public bool Success { get; set; }
    public string Message { get; set; }
}

然后您的代码变为

public async Task<StartServiceResult> StartService(string password = null)
{
    if (!string.IsNullOrEmpty(password))
    {
        _serviceController.Start(new[] {password});
        await _serviceController.WaitForStatusAsync(ServiceControllerStatus.Running);
        return new StartServiceResult { Success = true, Message = "Started from password" };
    }
    else if (TokenAccessFileExists())
    {
        _serviceController.Start();
        await _serviceController.WaitForStatusAsync(ServiceControllerStatus.Running);
        return new StartServiceResult { Success = true, Message = "Started from token" };
    }
    return new StartServiceResult { Success = false, Message = "Failed to start: no password nor token." };
}

您也可以使用枚举而不是字符串消息:

enum StartServiceResultType
{
    SuccessFromPassword,
    SuccessFromToken,
    Failure
}