2010-11-19 6 views
23

Mi clase de modelo de vista tiene un método (no estoy seguro si es una buena práctica o si se supone que los modelos de vista son estrictamente mecanismos de propiedad y cambio de propiedad) que se conecta a un servicio. Por supuesto, quiero manejar cualquier posible excepción de WCF al conectarme o desconectarme.¿Dónde puedo detectar Excepciones en MVVM?

Usemos el punto final no encontrado como ejemplo, considerando que es una excepción que quisiera llamar la atención del usuario. Considere el ejemplo de código en bruto:

public void Connect() 
{ 
    ServiceClient proxy = null; 
    try 
    { 
     proxy = new ServiceClient(); 
     proxy.Subscribe(); 
     // ... 
    } 
    catch(EndpointNotFoundException) 
    { 
     // should I do something here? 
    } 
    // .. other WCF related exception catches and a finally 
} 

¿Se considera una buena práctica para invocar tal System.Windows.MessageBox.Show() directamente en la captura o debería tal vez volver a lanzar la excepción por lo que otra capa de mi aplicación WPF atrapa ? Si es así, ¿dónde está el lugar ideal para atrapar tal excepción?

+0

¿Qué debe hacer exactamente el usuario con respecto a esta excepción? Debe decirle al usuario todo lo que necesita para poder "manejar" correctamente esta excepción. Si no hay nada que el usuario pueda hacer al respecto, entonces no le diga nada al usuario, tal vez, "Lo siento, pero algo anda mal". –

+1

@John, el usuario no necesita salvar el mundo. Solo necesito presentarle al usuario que el extremo distante no está disponible. Es por eso que menciono un MessageBox. Esta pregunta no se trata de lo que debo decirle al usuario, quiero saber cómo lidiar elegantemente con las excepciones en el patrón que estoy usando. – jlafay

+0

Manejo las fallas de WCF de esta manera: [MSDN] (http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx) – Gabe

Respuesta

27

He estado manejando las excepciones en mi cliente MVVM al capturarlas y envolverlas en una propiedad ErrorViewModel de lo que ViewModel haya tomado como excepción.

Digamos que un modelo de vista A captura la excepción EndpointNotFoundException. Para presentar este error, envuelvo la Excepción en un ErrorViewModel y la asigno a A's Error property.

la vista asociada con Un contiene una ContentControl con destino a la propiedad error Un 's. Mientras tanto, uso DataTemplate para asociar una Vista de Error al ErrorViewModel. En esa vista, Visibility se determina según si Una propiedad de error de contiene una excepción.

Así Vista Un 's contiene un error en mensajes Ver que sólo aparecerá cuando se detecta una excepción, y pueden ser despedidos por el usuario (un botón Aceptar en el mensaje de error Ver invoca un comando en Un que borra Una propiedad de error de, cambiando así la visibilidad de la vista del mensaje de error a Collapsed).

Hasta ahora, este parece ser un buen enfoque que preserva el desacoplamiento MVVM adecuado.

Espero que ayude. De una forma u otra, sinceramente, consideraría System.Windows.MessageBox.Show() en una aplicación de WPF como un último recurso. ¿Por qué renunciar a un rico control sobre la interfaz de usuario en favor de esa cosa antigua? Hablando de eso, aquí está another popup-implementation approach.

+0

Pensé que un MessageBox sería el último recurso (y en secreto con la esperanza de que así sea). – jlafay

+2

Me gusta este enfoque; es el trabajo de ViewModel representar un estado que se puede visualizar. Como tal, un error que ocurra en algún lugar del Modelo nunca debe ser 'empujado' hacia la Vista; más bien, el estado del ViewModel debería reflejar que ha habido un error. También podría ver la propagación del error hasta algún ErrorDisplayService, con un mecanismo centralizado para exponer los estados de error de varias fuentes. –

+0

Me gusta mucho esto. Si te entiendo, debes abstraer cualquier excepción que signifique "No puedo llegar al otro extremo" en algún error para que se muestre al usuario. Eso es perfecto. Si esto hubiera sido una API, habría sugerido incluir tales excepciones en otra que diga: "No se puede llegar al otro extremo". –

Cuestiones relacionadas