Come si dovrebbe gestire una relazione padre-figlio usando MVP?

2

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?

    
posta Will Marcouiller 23.09.2014 - 23:03
fonte

0 risposte

Leggi altre domande sui tag