2010-03-14 9 views
6

¿La vista no tiene nada específico de evento en su interfaz y llama a los métodos simples del presentador para manejar eventos y no tiene EventHandlers oficial? Por ejemploVista pasiva MVP de Webforms: manejo de eventos

// ASPX 
protected void OnSaveButtonClicked(object sender, EventArgs e) 
{ 
    _Presenter.OnSave(); 
} 

o de que las vistas han manejadores de sucesos de eventos definidos en su interfaz y vincular a los que van explícitamente a controlar los acontecimientos en la página

// View 
    public interface IView 
    { 
... 
     event EventHandler Saved; 
... 
    } 

// ASPX Page implementing the view 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     SaveButton.Click += delegate { Saved(this, e); }; 
    } 

// Presenter 
    internal Presenter(IView view,IRepository repository) 
    { 
     _view = view; 
     _repository = repository; 
     view.Saved += Save; 
    } 

El segundo parece como un montón de código de plomería para añadir por todas partes.

Mi intención es comprender los beneficios de cada estilo y no solo una respuesta general para usar. Mis objetivos principales son la claridad y la comprobabilidad de alto valor. La capacidad de testamento en general es importante, pero no sacrifico la simplicidad y la claridad del diseño para poder agregar otro tipo de prueba que no conduzca a demasiada ganancia sobre los casos de prueba ya posibles con un diseño más simple. Si una opción de diseño no permite una mayor capacidad de prueba, incluya un ejemplo (el pseudo código es correcto) del tipo de prueba que ahora puede ofrecer, de modo que pueda tomar una decisión si valoro ese tipo de prueba adicional lo suficiente. ¡Gracias!

Actualización: ¿Mi pregunta necesita más aclaraciones?

Respuesta

-3

En la interfaz de su vista debe tener una referencia al botón guardar y luego todo se hace en el presente o. Esto mantiene su vista libre de código y su preseneter fácilmente comprobable.

// View interface 
public interface IView 
{ 
    Button SaveButton; 
} 

// View code behind 
public Button SaveButton 
{ 
    get { return btnSave; } 
} 

// Presenter 
internal Presenter(IView view,IRepository repository) 
{ 
    _view = view; 
    _repository = repository; 
    view.SaveButton.Click += new EventHandler(Saved);; 
} 

void Saved(object sender, EventArgs e) 
{ 
    // do save 
} 

'

1

Nos hemos implementado MVP usando formularios web, y optamos por la opción más simple de tener los métodos vista de compra sobre el presentador de eventos de botón directamente etc.

Nuestra justificación es que no podemos probar la vista directamente de todos modos (usamos waitin para probar esta capa), así que el objetivo principal aquí es tener un presentador de prueba de la unidad que esté separado lo más posible de la vista/modelo.

De acuerdo con mi experiencia, nunca vas a lograr un MVP completamente limpio en WebForms de todos modos debido a la naturaleza de la bestia (realmente les encantaría que uses ese código detrás del archivo ...), entonces no lo haría No te cuelgues de eso.

Al final del día, es necesario evaluar las razones de la separación de la vista y la presentación lógica y determinar si cualquiera de estos métodos va a ayudar/impedir que más adelante ....

6

I don' Me gusta tener una referencia explícita a un Botón (o cualquier otro control) en la interfaz. Esto significa que estamos estrechamente vinculados a la implementación de los controles.

Los controles se pueden implementar de forma muy diferente entre los tipos de proyecto (por ejemplo, Winforms y ASP).

Esto significa que la interfaz podría necesitar modificarse para diferentes vistas, que es exactamente lo que no queremos. El objetivo principal de MVP es que el presentador puede confiar en una interfaz estable que permite la separación de la interfaz de usuario del modelo, la sustitución fácil de vistas concretas y la capacidad de prueba.

Es mejor seguir con las propiedades y los métodos en la interfaz que no dependen de ningún control específico y dejar los detalles de implementación en las vistas concretas.

Cuestiones relacionadas