Non penso che sia una saggia idea avere View e Presenter accoppiati così stretti.
In base alla schermata passiva
oppure Supervisore Presentatore il relatore e la vista sono separati da un'interfaccia implementata dalla vista. Il presentatore chiama l'interfaccia. Ecco un esempio di un relatore supervisore.
PRESENTATORE
questa classe non ha dipendenza dalla libreria della GUI usata
public class Presenter
{
IView view;
public Presenter(IView view)
{
this.view = view;
}
public void ValidateInPut(string value)
{
if (!String.IsEmptyOrNull(value) && value.Contains("9"))
{
view.ShowError("The value in the Text box is invalid");
}
}
}
ViewInterface
public inteface IView
{
void ShowError(string message);
}
Visualizza
public class Form1:Form, IView
{
private Presenter presenter;
public Form1()
{
this.presenter = new Presenter(this); // or have a Dependcy Injection Framework do this
}
private void txtACNo_Validating(object sender, CancelEventArgs e)
{
presenter.ValidateInPut(txtACNo); // validate
}
public void IView.ShowError(string message);
{
MessageBox.Show(mesage);
}
}
Motivazioni
Utilizzando la vista e il presentatore, il relatore (con tutta la sua logica (busines)) diventa facilmente testabile o la visualizzazione può essere sostituita da una pagina Web senza la necessità di adattare la logica del relatore.
test
public class Test:IView
{
bool showErrorCalled = false;
public void Test()
{
var p = new Presenter(this);
showErrorCalled = false;
p.ValidateInput("8");
Test.Assert(showErrrocalled);
}
public void IView.ShowError(string message);
{
showErrorCalled = true;
}
}
pagina web
public Default:Page, IView
{
private Presenter presenter;
public Default()
{
this.presenter = new Presenter(this);
}
public Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
presenter.ValidateInput(txtAcNo.Text);
}
}
public void IView.ShowError(string message);
{
Error.Text = message;
}
}
PS
Ricorda che l'operatore di cast su un oggetto potrebbe fallire. Il tuo codice
var controller = (TextBox)sender;
funzionerà solo finché sender
è un TextBox
. È meglio controllare se esiste un tipo più generalizzato nella gerarchia che fornisce ancora l'interfaccia necessaria. Nel tuo caso potrebbe essere Control
che ha anche una proprietà Text
. Un approccio più difensivo sarebbe:
var controller = sender as Control; // try to cast, if not return null
if (controller != null)
{
// do stuff with controller
}
else
{
// logging
Debug.WriteLine("controller is null");
}