MVC - это просто шаблон, и его можно легко реализовать без какой-либо инфраструктуры. Это в основном диктует Отделение Концерна [SoC] в том, что касается Gui и бизнес-функциональности. Я бы также рекомендовал вам поискать Model-View-Presenter [MVP] и Model-View-ViewModel [MVVM] - небольшие вариации MVC. MVVM более распространен, чем строгий MVC.
Ах, кроме этого, есть несколько активаторов MVC, таких как Inversion of Control [IoC] и Dependency Injection [DI]. Эти шаблоны облегчают создание и автоматизируют «разводку» ваших компонентов MVC, чтобы они могли взаимодействовать друг с другом. В этом отношении вы можете взглянуть на ObjectBuilder от Microsoft [если он нацелен на .Net 2.0] или покататься с гораздо более легким контейнером Unity, если вы хотите что-то более новое. Лично я предпочитаю контейнер Castle Windsor для всей моей работы с IoC, но Unity созревает, и я могу скоро переключиться.
Конечно, вы также можете взглянуть на фреймворки, частью которых являются эти компоненты, а именно, Composite Application Block [CAB] или Prism соответственно, но я бы не советовал. Они предлагают несколько изящных решений [вы можете эмулировать «Команды» в WinForms с помощью EventCroker от CAB], но если у вас нет особых требований, это лишний багаж, иммо.
Если вы понимаете шаблон [MVC], то шаблон в значительной степени не нужен.
Если вам интересно, как эти кусочки собираются вместе, быстрый курс MVC:
// this is the controller. manages business logic, handles
// Gui inputs
public class Controller
{
// constructor
public Controller (View view, Model model)
{
// nothing magical about wiring things up
// obtain reference through ctor here, and
// hook up events, or provide bindings
// attach event handler - obviously make sure
// signatures match etc, i'm winging this whole thing
view.ButtonSubmit.Click += Submit;
// understand this will set the value of view's
// text once, here on instantiation. the problem
// with WinForms is databinding, you will have to
// roll your own. to provide proper databinding
// Model class must expose events when they change
// and then Controller or View must listen to event
// and bind new value to View
view.TextBox.Text = model.Count;
}
// Submit button clicked!
public void Submit () { ... }
}
// this is the model. contains all data relevant
// to Gui component
public class Model
{
// a count of stuff
public int Count { get; set; }
}
// this is the view. simple WinForms object,
// contains buttons, white fluffy clouds, and other
// good stuff
public class View : Control
{
public TextBox TextBoxCount;
public Button ButtonSubmit;
}
public static class Program
{
static void Main ()
{
// you can do this explicitly like below, or implicitly
// if you configure and use an IoC container.
View view = new View ();
Model model = new Model ();
Controller controller = new Controller (view, model);
}
}
Основной недостаток MVC + WinForms выше в Контроллере. Контроллер напрямую ссылается на объекты WinForms, что делает большинство сценариев сложным для модульного тестирования. То, что вы хотели бы, это абстракция от элементов Gui и событий, которые они бросают. Кроме того, вы не хотите выполнять задачу связывания повторяющихся данных, на которую я намекаю встроенным комментарием. WPF решает их, вводя команды и привязку данных.