In un MDI WinForms applicazione, si farebbe così:
public partial MainMdiForm : Form {
public MainMdiForm() { InitializeComponent(); }
private void manageCustomersToolStripMenuItem_Click(object sender, EventArgs e) {
var cmf = new CustomerManagementForm();
cmf.MdiParent = this;
cmf.Show();
}
}
In modo che CustomerManagementForm
non esca mai.
Uso di Model-View-Presenter insieme a Iniezione delle dipendenze , il codice aggiunge un livello di astrazione che in realtà non consente per impostare MdiParent della mia vista / modulo.
MainMdiForm
public partial MainMdiForm : Form, IMainView {
public MainMdiForm() { InitializeComponent(); }
public IMainViewUiHandler Handler { get; set; }
private void manageCustomersToolStripMenuItem_Click(object sender, EventArgs e) {
Handler.ManageCustomers();
}
}
IMainView
public interface IMainView : IView, IHasUiHandler<IMainViewUiHandler> { }
IHasUiHandler
public interface IHasUiHandler<H> where H : IUiHandler {
H Handler { get; set; }
}
IUiHandler
public interface IUiHandler { }
IMainViewUiHandler
public interface IMainViewUiHandler : IUiHandler {
void ManageCustomers();
}
MainPresenter
public class MainPresenter : Presenter<IMainView>, IMainViewUiHandler {
public MainPresenter(IMainView view
, ICustomerManagementPresenterFactory customerManagementPresenterFactory)
: base(view) {
view.Handler = this;
this.customerManagementPresenterFactory = customerManagementPresenterFactory;
}
public void ManageCustomers() {
var p = customerManagementPresenterFactory.Create();
p.ShowView();
}
private readonly ICustomerManagementPresenterFactory customerManagementPresenterFactory;
}
Come puoi vedere, non c'è un posto dove impostare Form.MdiParent proprietà per la vista gestita dal relatore. E l'esposizione di tali proprietà potrebbe rompere l'astrazione e vincolarla strettamente a WinForms, poiché nessun'altra piattaforma utilizza tale gerarchia con le diverse interfacce utente. Sebbene questa applicazione sia destinata a essere un semplice esempio dell'uso di MVP insieme a DI , desidero renderlo il più pulito possibile.
Ho pensato di creare una singola interfaccia che usasse la terminologia Parent e componga la mia visualizzazione solo dall'interno dell'applicazione Windows Form, in modo che altre piattaforme non ereditassero da questa proprietà inutile.
Qualche idea su come dovrei andare avanti con questo?