Посмотрите видеолекцию DI-контейнеры (~1.5 часов)
-
Разминка. В классе Program переделайте Main так, чтобы MainForm создавался контейнером. Удалите у MainForm конструктор без параметров и сделайте так, чтобы контейнер инжектировал в MainForm список IUiAction.
-
INeed. Изучите код KochFractalAction. Изучите механику работы INeed и DependencyInjector. Оцените такой подход к управлению зависимостями.
-
Рефакторинг. Измените класс KochFractalAction так, чтобы его зависимости IImageHolder и Pallette инжектировались явно через конструктор, без использования интерфейса INeed.
Подсказка. Сложность в том, чтобы в MainForm и KochFractalAction оказались ссылки на один и тот же объект PictureBoxImageHolder.
Убедитесь, что настройка палитры для рисования кривой Коха всё ещё работает.
-
Еще рефакторинг. Изучите KochFractalAction и поймите, что на самом деле IImageHolder и Pallette ему не нужны. Измените его так, чтобы он принимал только KochPainter.
-
Фабрика. Аналогично удалите INeed, и явное использование контейнера из класса DragonFractalAction. Дополнительное ограничение — нельзя менять публичный интерфейс DragonPainter. Особенность в том, что одна из зависимостей DragonPainter — DragonSettings оказывается известной только в процессе работы экшена. Из-за этого вы не можете просить инжектировать в конструктор уже готовый Painter. Вместо этого инжектируйте фабрику DragonPainter-ов. https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface
-
Фабрика 2. Преобразуйте DragonSettingsGenerator также в фабрику и инжектируйте эту зависимость в DragonFractalAction.
-
Новая зависимость. Переведите DragonPainter на использование цветов палитры, как это сделано в KochPainter.
Убедитесь, что экшен настройки палитры работает как надо. Если вы всё сделали правильно, то для добавления зависимости вам не пришлось править код работы с контейнером вообще. Магия!
- Источник зависимости. Аналогично отрефакторите ImageSettingsAction. Попробуйте придумать, как избавиться от класса IImageSettingsProvider.
Убедитесь, что окно настройки размера изображения запоминает установленный размер.
-
Избавьтесь от остальных использований INeed и удалите этот интерфейс и класс DependencyInjector из проекта.
-
Обратите внимание на многочисленные привязки к IUiAction. В реальных проектах количество классов может исчисляться десятками и сотнями. Воспользуйтесь документацией https://github.com/ninject/Ninject.Extensions.Conventions и найдите, как все эти привязки сделать в одну строчку.
-
Кажется после последнего рефакторинга пункты меню перемешались. Что делать?