2017-06-27 8 views
0

Ich programmiere WPF-Anwendung mit MVVM-Muster und Dilemma. In ViewModel habe ich eine Instanz von BusinessLogic. Hier ist die Funktion:Exception werfen oder Ergebnis zurückgeben?

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"); 

    } 

Diese Funktion wird von VM aufgerufen. Aber ich bin mir nicht sicher, was ich tun soll, wenn die Bedingungen nicht stimmen. Ich sollte expection werfen und es in VM fangen oder kundenspezifisches Ergebnis zurückgeben?

Vielen Dank für Antwort

EDIT: Um mehr klar: Ich frage, was Ansatz bequemer ist: throw Ausnahme von Service-Layer und es in VM behandeln oder Rückkehr irgendeine Art von Ergebnis zu VM.

+1

Entweder funktioniert, vorausgesetzt, der aufrufende Code behandelt es richtig. Aber ich würde eine Ausnahme auslösen, da der Rückgabetyp nicht wirklich mit der Meldung eines Fehlers übereinstimmt. –

+0

Ein Anmeldefehler in einer MVVM-Anwendung sollte ein Statusansichtsmodell einer bestimmten Art aktualisieren, um den Benutzer über das Problem zu informieren. Normalerweise behandeln Sie das mit einem benutzerdefinierten Ergebnis und nicht mit Ausnahmen. – hoodaticus

+0

Aber um den Fehler in VM richtig zu behandeln, sollte ich verschiedene Ausnahmen (z. B. NoPasswordException, NoTokenException) auslösen. Habe ich recht? – JuP

Antwort

1

Beide Optionen sind korrekt.

Sie könnten einfach eine Ausnahme auslösen und im Anrufer behandeln.

Oder Sie könnten eine Struktur wie diese schaffen den Erfolg/Mißerfolg der Operation zu beschreiben:

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

Dann Code

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." }; 
} 

Sie wird auch eine Enumeration anstelle einer Zeichenfolge verwenden könnte Nachricht:

enum StartServiceResultType 
{ 
    SuccessFromPassword, 
    SuccessFromToken, 
    Failure 
} 
+0

Dies ist eine Option. Aber ich dachte, wenn dieser Ansatz nicht C++ oldschool ist. – JuP

Verwandte Themen