Слайд 2Инверсия зависимости
Зависимости между классами превращаются в ассоциации между объектами.
Ассоциации между объектами могут
![Инверсия зависимости Зависимости между классами превращаются в ассоциации между объектами. Ассоциации между](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-1.jpg)
устанавливаться и меняться во время выполнения приложения.
Это позволяет сделать модули менее связанными между собой
Слайд 32 принципа инверсии зависимостей:
Модули верхнего уровня не должны зависеть от модулей нижнего
![2 принципа инверсии зависимостей: Модули верхнего уровня не должны зависеть от модулей](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-2.jpg)
уровня. Оба типа модулей должны зависеть от абстракций;
Абстракция не должна зависеть от реализации. Реализация должна зависеть от абстракции.
Слайд 4Схема программы копирования данных
![Схема программы копирования данных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-3.jpg)
Слайд 5 Сopy может выглядеть примерно следующим образом:
![Сopy может выглядеть примерно следующим образом:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-4.jpg)
Слайд 6МИНУС
Низкоуровневые классы Keyboard и File обладают высокой гибкостью. Можно легко использовать их в контексте,
![МИНУС Низкоуровневые классы Keyboard и File обладают высокой гибкостью. Можно легко использовать](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-5.jpg)
отличном от класса CopyManager.
Однако сам класс CopyManager не может быть повторно использован в другом контексте. Например, для отправки данных из файла системному обработчику логов.
Слайд 7Используя принцип инверсии зависимостей, можно сделать класс CopyManager независимым от объектов источника и назначения
![Используя принцип инверсии зависимостей, можно сделать класс CopyManager независимым от объектов источника и назначения данных.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-6.jpg)
данных.
Слайд 9Класс CopyManager должен полагаться только на выработанные абстракции и не делать никаких предположений по поводу
![Класс CopyManager должен полагаться только на выработанные абстракции и не делать никаких](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-8.jpg)
индивидуальных особенностей объектов ввода/вывода:
Слайд 10Теперь код обладает следующими качествами:
класс может быть использован для копирования данных в
![Теперь код обладает следующими качествами: класс может быть использован для копирования данных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-9.jpg)
контексте, отличном от данного;
возможно добавлять новые устройства ввода/вывода, не меняя при этом класс Copy.
Слайд 11Формы инверсии зависимостей
Существует две формы инверсии зависимостей:
активная и пассивная.
При использовании пассивной
![Формы инверсии зависимостей Существует две формы инверсии зависимостей: активная и пассивная. При](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-10.jpg)
формы объекты зависимости внедряются в зависимый объект. Зависимому объекту не надо прилагать никаких усилий, все нужные сервисы он получает через свой интерфейс.
Активная форма, в отличие от пассивной, предполагает, что зависящий объект будет сам получать свои зависимости при помощи вспомогательных объектов.
Слайд 12Пассивная инверсия зависимостей (Dependency Injection):
внедрение через конструктор
внедрение через устанавливаемое свойство
внедрение через интерфейс
внедрение через поле
![Пассивная инверсия зависимостей (Dependency Injection): внедрение через конструктор внедрение через устанавливаемое свойство](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-11.jpg)
Слайд 13Активная инверсия зависимостей (Dependency Lookup):
pull-подход: предполагается наличие в системе общедоступного объекта, который знает обо всех
![Активная инверсия зависимостей (Dependency Lookup): pull-подход: предполагается наличие в системе общедоступного объекта,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-12.jpg)
используемых сервисах. В качестве такого объекта может выступать объект, реализующий паттерн Service Locator. Локатор реализует паттерн синглетона, благодаря чему доступ к нему можно получить из любого места приложения.
push-подход: данная методика отличается от pull-подхода тем, как объект узнает об объекте-локаторе. При использовании pull-подхода класс сам получал локатор посредством класса-синглетона. Push-подход характеризуется тем, что объект-локатор (или как его иногда называют контекст) передается в класс извне (обычно через конструктор).
Слайд 14IoC контейнер
IoC контейнер – это специальный объект-сборщик, который на основании схемы зависимостей между классами и
![IoC контейнер IoC контейнер – это специальный объект-сборщик, который на основании схемы](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-13.jpg)
абстракциями может создать граф объектов. Любой IoC контейнер реализует принцип инверсии зависимостей.
Слайд 15MEF
Она позволяет строить модульные приложения с минимальным уровнем связности частей (parts) приложения.
![MEF Она позволяет строить модульные приложения с минимальным уровнем связности частей (parts)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/858814/slide-14.jpg)
Эта библиотека включает в себя не только Dependency Injection контейнер, но большой объём инфраструктуры: множество механизмов поиска элементов композиции в сборках, удалённых XAP файлах, механизм пометки элементов композиции с помощью .Net атрибутов и т.д.