开发者

Simplest approach for applying the MVP pattern on a Desktop (WinForms) and Web (ASP.NET) solution

Having almost no architectural experience I'm trying to design a DRY KISS solution for the .NET 4 platform taking an MVP approach that will eventually be implemented as a Desktop (WinForms) and Web (ASP.NET or Silverlight) product. I did some MVC, MVVM work in the past but for some reason I'm having difficulties trying to wrap my head around this particular one so in an effort to get a grip of the pattern I've decided to start with the simplest sample and to ask you guys for some help.

So assuming a quite simple Model as follows (in practice it'd most definitely be a WCF call):

internal class Person
{
    internal string FirstName { get; set; }
    internal string LastName { get; set; }
    internal DateTime Born { get; set; }
}

public class People
{
    private readonly List<Person> _people = new List<Person>();
    public List<Person> People { get { return _people; } }
}

I was wondering:

  1. What would be the most generic way to implement its corresponding V开发者_如何学Ciew/Presenter triad (and helpers) for say, a Console and a Forms UI?
  2. Which of them should be declared as interfaces and which as abstract classes?
  3. Are commands always the recommended way of communication between layers?

And finally: by any chance is there a well-docummented, testeable, light framework to achieve just that?


I've written a number of apps that require a GUI and a winforms UI, the approach I have typically taken to implementing MVP is to create a generic view interface (you can subclass this for more specific views) and a controllerbase class which is given a view. You can then create different view implementations which inherit from the IView (or more specific view) interface

interface IView
{
    event EventHandler Shown;
    event EventHandler Closed;

    void ShowView(IView parentView);
    void CloseView();
}

class ControllerBase<T> where T: IView
{
    private T _view;

    public ControllerBase(T view)
    {
        _view = view;
    }

    public T View
    {
        get { return _view; }
    }

    public void ShowView(IView owner)
    {
        _view.ShowView(owner);
    }

    public void ShowView()
    {
        ShowView(null);
    }

    public void CloseView()
    {
        _view.CloseView();
    }
}

Heres an example of how it would work in a specific case

interface IPersonView: IView
{
    event EventHandler OnChangeName;
    string Name { get; set; }
}

class PersonController: ControllerBase<IPersonView>
{
    public PersonController(string name,IPersonView view) : base(view)
    {
        View.Name = name;
        View.OnChangeName += HandlerFunction;
    }

    private void HandlerFunction(object sender, EventArgs e)
    {
        //logic to deal with changing name here
    }
}

To implement this view in winforms, just make sure your form inherits from IPersonView and implements all the required properties/events and you're good to go. To instantiate the view/controller you'd do something like the following

PersonForm form = new PersonForm();
PersonController controller = new PersonController("jim",form);
controller.ShowView();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜