我使用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。
答案 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
}