IoC-контейнер в ASP.NET с использованием шаблона MVP (Model-View-Presenter)

25 апреля 2010 г.

После видео про управление зависимостями в коде многие интересуются, как же сделать тоже самое в классическом ASP.NET. Проблема в том, что нужно найти точку старта для активного внесения зависимостей. В ASP.NET MVC она создана за нас – это фабрика контроллеров IControllerFactory.

По решению этой проблемы есть довольно много статей, я дам на них ссылки и добавлю свои комментарии.

Дмитрий Воробьёв прислал мне ссылку на серию отличных видео про использование IoC-контейнеров в ASP.NET . Наиболее интересная статья из этой серии – Unity IoC Dependency Injection and ASP.NET Model-View-Presenter.

Очень важно понимать, что ASP.NET WebForms – это только один из способов работы пользователя с данными вашей системы. От aspx-страницы требуется только отобразить данные или вернуть ввод пользователя. Хочу предостеречь вас от ошибки. Не пытайтесь писать бизнес-логику прямо в code-behind. Её нельзя протестировать и такой подход ведёт к многочисленному дублированию кода и ошибкам в проектировании.

Для ASP.NET и Windows-приложений лучше всего использовать шаблон Model-View-Presenter. Отличное описание этого шаблона вы найдете в книге Роберта Мартина Agile Principles, Patterns, and Practices in C# в главе The Payroll User Interface: MODEL VIEW PRESENTER. В этой главе подробно рассмотрено, как применять шаблон MVP и преимущества, которые мы получаем:

  • разделение отображения данных View и их подготовки и обработки Presenter
  • возможность модульного тестирования

Кроме этого, перед нами открывается новая возможность – использование IoC-контейнера. Точкой старта для активного внесения зависимостей будет создание Presenter'а.

Я реализовал одно из возможных решений и добавил его в исходный код проекта с ASP.NET MVC. Вся реализация находится в двух проектах: Web.Classic и Web.Classic.UI. Можете развивать его дальше и, если получится что-то интересное, присылайте мне. Рассмотрим его достоинства и выложим исходный код.

Более элегантное решение

Одной из возможных альтернатив моему решению может быть использование фабрики aspx-страниц. Подход подробно описан в статье Inversion of Control and Dependency Injection with WebForms. Это решение чем-то напоминает фабрику контроллеров в ASP.NET MVC.

Моя книга «Антихрупкость в IT»

Как достигать результатов в IT-проектах в условиях неопределённости. Подробнее...