2016-04-02 7 views
0

Ich versuche, das MVVM-Entwurfsmuster zu implementieren. Ich habe eine Methode, die in meinem Code hinter Datei war auf eine Schaltfläche klicken Ereignis gebunden, die wie so ein Lehr-Video öffnet:Wohin soll Code gehen, der eine EXE öffnet, während er den Best Practices von MVVM entspricht?

private void OpenvideoButton_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     try 
     { 
      Process.Start(@"Instructional_Video.wmv"); 
     }catch 
     { 
      MessageBox.Show("Error playing instructional video"); 
     } 

     e.Handled = true; 
    } 

Meine Frage ist, wo soll ich diesen Code in der MVVM Architektur habe? Da das Video ein grafisches Objekt ist, wie auch die MessageBox, habe ich daran gedacht, es im Code zu behalten, aber ich bin auch sehr vorsichtig, Code dort zu hinterlassen.

Wo sollte ich den Code wie oben beibehalten und gleichzeitig die MVVM-Best Practices einhalten?

Antwort

1

Code, der mit der Außenwelt "spricht" (Betriebssystem, Dateisystem, Datenbank, Webservice, UI-Layer usw.) sollte in Services platziert werden - Objekte, die verspottet werden können, wenn Sie Komponententests schreiben (s) für Ihr Ansichtsmodell.

Es ist eine gute Praxis Dienstleistungen in Sicht Modell zu injizieren, mit Dependency Injection Container wie MEF, Autofac, ninject usw.

Etwas wie folgt aus:

public interface IPlayerLauncher 
{ 
    void Launch(string fileName); 
} 

public interface IDialogService 
{ 
    void ShowMessageBox(string message); 
} 

public class SomeViewModel 
{ 
    private readonly IPlayerLaucher playerLauncher; 
    private readonly IDialogService dialogService; 

    private void HandleOpenVideo() 
    { 
     try 
     { 
      playerLauncher.Launch("Instructional_Video.wmv"); 
     } 
     catch 
     { 
      dialogService.ShowMessageBox("Error playing instructional video");    
     } 
    } 

    public SomeViewModel(IPlayerLaucher playerLaucher, IDialogService dialogService) 
    { 
     this.playerLauncher = playerLauncher; 
     this.dialogService = dialogService; 
     OpenVideoCommand = new RelayCommand(HandleOpenVideo); 
    } 

    public ICommand OpenVideoCommand { get; } 
} 

public class PlayerLaucher : IPlayerLauncher 
{ 
    public void Lauch(string fileName) 
    { 
     Process.Start(fileName); 
    } 
} 

public class DialogService : IDialogService 
{ 
    public void ShowMessageBox(string message) 
    { 
     MessageBox.Show(message); 
    } 
} 

RelayCommand (auch DelegateCommand) ist Implementierung von ICommand, die übergebene Delegate ausführt. Es gibt viele Implementierungsbeispiele über das Internet.

Anstatt Click-Ereignis zu behandeln, binden Sie die Schaltfläche an OpenVideoCommand. Beachten Sie, dass die Ausnahmebehandlung wie diese keine gute Wahl ist, aber das hängt nicht mit dieser Frage zusammen.

Verwandte Themen