Простейший подход для применения шаблона MVP к решению для настольных компьютеров (WinForms) и веб (ASP.NET) - PullRequest
3 голосов
/ 02 августа 2011

Не имея почти никакого архитектурного опыта, я пытаюсь разработать решение DRY KISS для платформы .NET 4 , взяв MVP подход, который в конечном итоге будет реализован как настольный (WinForms) и веб (ASP.NET или Silverlight) продукт. В прошлом я работал над MVC, MVVM, но по какой-то причине у меня возникают трудности, пытаясь обернуть голову вокруг этого конкретного, поэтому, чтобы получить представление о паттерне, я решил начать с самого простого примера и попросить вас, ребята, о помощи.

Итак, предполагая довольно простую модель следующим образом (на практике это определенно будет вызов WCF):

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; } }
}

Мне было интересно:

  1. Каков наиболее общий способ реализации соответствующей триады View / Presenter (и помощников), например, для консоли и пользовательского интерфейса Forms?
  2. Какие из них должны быть объявлены как интерфейсы, а какие как абстрактные классы?
  3. Команды всегда рекомендуются для связи между слоями?

И, наконец: случайно ли есть хорошо документированная, проверяемая, легкая основа для достижения именно этого?

1 Ответ

5 голосов
/ 01 сентября 2011

Я написал несколько приложений, для которых требуется графический интерфейс пользователя и пользовательский интерфейс winforms, подход, который я обычно применяю для реализации MVP, заключается в создании универсального интерфейса представлений (вы можете создать подкласс для более конкретных представлений) и класса controllerbaseкоторый дан вид.Затем вы можете создавать различные реализации представлений, которые наследуются от интерфейса IView (или более конкретного представления)

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();
    }
}

Вот пример того, как это будет работать в конкретном случае

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
    }
}

Комуреализуйте это представление в winforms, просто убедитесь, что ваша форма наследуется от IPersonView и реализует все необходимые свойства / события, и вы готовы к работе.Чтобы создать представление / контроллер, вы должны сделать что-то вроде следующего:

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