c# winforms .net-2.0 mvp

c# - MVP Framework para winforms



.net-2.0 (2)

Estoy trabajando en un nuevo proyecto y quiero implementar el patrón MVP. ¿Hay un marco para winforms que utilizan este patrón? Revisé CAB pero mi proyecto no es complejo para implementarlo, busco algo más simple de implementar y usar.

¡Gracias!


Esto no es un marco, pero leería la serie Construye tu propia cabina de Jeremy Miller antes de que te instales en tu diseño. Cubre los diversos patrones de presentación en WinForms.


Si está buscando algo simple ... entonces realmente no necesita un marco . Puedes rodar tu propio patrón de MVP.

Escribir las clases base toma solo unos minutos.

//Base Presenter Class public class Presenter<TView> where TView : class, IView { public TView View { get; private set; } public Presenter(TView view) { if (view == null) throw new ArgumentNullException("view"); View = view; View.Initialize += OnViewInitialize; View.Load += OnViewLoad; } protected virtual void OnViewInitialize(object sender, EventArgs e) { } protected virtual void OnViewLoad(object sender, EventArgs e) { } } //Base View public interface IView { event EventHandler Initialize; event EventHandler Load; }

Eso es todo lo que necesitas para comenzar. A continuación, puede definir una nueva vista que se adapte a sus necesidades.

public interface IPersonView : IView { String PersonName { get; set; } DateTime? DOB { get; set; } event EventHandler SavePerson; }

Crea un presentador que use la vista.

public class PersonPresenter : Presenter<IPersonView> { private IPersonDb PersonDB { get; set; } public PersonPresenter(IPersonView view, IPersonDb personDB) : base(view) { if (personDB == null) throw new ArgumentNullException("personDB"); PersonDB = personDB; } protected override void OnViewInitialize(object sender, EventArgs e) { base.OnViewInitialize(sender, e); View.PersonName = "Enter Name"; View.DOB = null; View.SavePerson += View_SavePerson; } void View_SavePerson(object sender, EventArgs e) { PersonDB.SavePerson(View.PersonName, View.DOB); } }

Y, finalmente, ponerlo en uso en una nueva forma.

public partial class Form1 : Form, IPersonView { private PersonPresenter Presenter { get; set; } public Form1() { Presenter = new PersonPresenter(this, new PersonDb()); InitializeComponent(); InvokeInitialize(new EventArgs()); } public string PersonName { get { return tbName.Text; } set { tbName.Text = value; } } public DateTime? DOB { get { return String.IsNullOrWhiteSpace(tbDOB.Text) ? (DateTime?) null : DateTime.Parse(tbDOB.Text); } set { tbDOB.Text = String.Format("{0}", value); } } public event EventHandler Initialize; public void InvokeInitialize(EventArgs e) { EventHandler handler = Initialize; if (handler != null) { handler(this, e); } } public event EventHandler SavePerson; public void InvokeSavePerson(EventArgs e) { EventHandler handler = SavePerson; if (handler != null) { handler(this, e); } } }

Me gustan mucho las cosas de Jeremy Miller. Y he usado Smart Client Software Factory ... pero se trata de resolver problemas complicados muy grandes. Hay tantos otros patrones mezclados que en un principio superan la simplicidad del patrón MVP.

Comience de manera simple y, a medida que comience a correr en lugares difíciles, puede comenzar a agregar elementos como los Localizadores de servicios y los Agregadores de eventos.

El patrón MVP es realmente muy trivial de implementar. Espero que esto pueda ayudar a que comiences a correr más rápido.

Aclamaciones,
Josh