Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

IoC контейнер

Читайте также:
  1. III. Предоставление транспортных средств и контейнеров, предъявление и прием груза для перевозки, погрузка грузов в транспортные средства и контейнеры
  2. IV. Определение массы груза, опломбирование транспортных средств и контейнеров
  3. V. Сроки доставки, выдача груза. Очистка транспортных средств и контейнеров
  4. Автоматизация учета времени нахождения вагонов и контейнеров и начисления платы за пользование ими
  5. Аналитический расчёт мощности теплопоступлений в изотермические вагоны и контейнеры для проектных целей
  6. Аналитический расчёт мощности теплопоступлений в рефрижераторные вагоны и контейнеры для условий эксплуатации в однородной климатической зоне

Очень важное понятие, связанное с инверсией зависимостей – это IoC контейнеры. IoC контейнер – это специальный объект-сборщик, который на основании схемы зависимостей между классами и абстракциями может создать граф объектов. Любой IoC контейнер реализует принцип инверсии зависимостей.

Одной из реализаций IoC контейнера является MEF. Это очень мощный проект, который затрагивает очень много аспектов конструирования ПО. Одним из таких аспектов является конструирование объектов на основании его связей. Причем связи между объектами могут задаваться в виде атрибутов и анализироваться в процессе выполнения приложения.

MEF

Библиотека MEF появилась относительно недавно, но быстро завоевала популярность у.NET разработчиков за простоту использования и эффективность. Она позволяет строить модульные приложения с минимальным уровнем связности частей (parts) приложения. Эта библиотека включает в себя не только Dependency Injection контейнер, но большой объём инфраструктуры: множество механизмов поиска элементов композиции в сборках, удалённых XAP файлах, механизм пометки элементов композиции с помощью.Net атрибутов и т.д. Также существует версия MEF для Silverlight, которая имеет незначительные отличия от настольной версии.

IoC контейнер в MEF инкапсулируется классом CompositionContainer. Он содержит каталог типов, доступных для инъектирования. Наиболее удобным каталогом является DirectoryCatalog, включающий в себя типы из всех сборок, найденных в папке с приложением:

1: CompositionContainer container =

2: new CompositionContainer(new DirectoryCatalog("."));

Для удовлетворения зависимостей определенного класса используется метод ComposeParts:

1: container.ComposeParts(this);

Стоит иметь в виду, что как и другие IoC контейнеры, перед передачей компоненты в качестве импорта MEF удовлетворяет все её зависимости.

Компоненты в MEF не зависят друг от друга напрямую, вместо этого они зависят от контракта, который указывается строковым идентификатором. Каждый компонент объявляет контракты, которые он реализует, а каждая зависимость указывает необходимый ей контракт.

Реализация какого-либо контракта в терминологии MEF называется экспортом. Экспорты задаются при помощи атрибута [System.ComponentModel.Composition.ExportAttribute]. Данным атрибутом помечается класс сервиса, реализующего контракт. В качестве аргумента в конструктор атрибута передается имя реализуемого контракта. Следующий пример определяет контракт ILogger и объект Logger, его реализующий:

1: public interface ILogger

2: {

3: void Log(string message);

4: }

5:

6: [Export(typeof(ILogger))]

7: public class Logger: ILogger

8: {

9: public void Log(string message)

10: {

11: Console.WriteLine(message);

12: }

13: }

Чтобы различать несколько реализаций одного контракта, в экспорте возможно указать его имя:

1: [Export("GUI", typeof(ILogger))]

2: public class Logger: ILogger

3: {

4: public void Log(string message)

5: {

6: MessageBox.Show(message);

7: }

8: }

В таком случае возможно как получить все реализации контракта ILogger, так и найти конкретную спецификацию, работающую с графическим интерфейсом, по ключевому слову GUI.

По умолчанию MEF работает по принципу пассивной инверсии зависимостей. Зависимости от компонент в терминологии MEF называются импортами. Импорты с внедрением через устанавливаемое свойство или поле задаются при помощи атрибута [System.ComponentModel.Composition.ImportAttribute].

1: public class Processor

2: {

3: [Import]

4: public ILogger Logger { private get; set; }

5:

6: public void Process()

7: {

8: Logger.Log("Hello world");

9: }

10: }

При внедрении через конструктор, этот конструктор помечается атрибутом [System.ComponentModel.Composition.ImportingConstructorAttribute].

1: public class Processor

2: {

3: [ImportingConstructor]

4: public Processor(ILogger logger)

5: {

6: _logger = logger;

7: }

8:

9: // Private fields

10: private ILogger _logger;

11:

12: public void Process()

13: {

14: _logger.Log("Hello world");

15: }

16: }

Обычно MEF определяет имя импортируемого контракта исходя из CLR типа свойства, поля или параметра конструктора (в зависимости от выбранного способа внедрения). Помимо этого существует возможность указать имя контракта вручную, через аргумент конструктора атрибута:

1: public class Processor

2: {

3: [Import("GUI")]

4: public ILogger Logger { private get; set; }

5:

6: public void Process()

7: {

8: Logger.Log("Hello world");

9: }

10: }

Помимо пассивной инверсии зависимостей при помощи MEF возможно реализовать активную инверсию зависимостей с использованием библиотеки CommonServiceLocator. Данная библиотека содержит обобщенный интерфейс для разрешения зависимостей, абстрагированный от конкретного IoC контейнера:

1: var locator = new MefServiceLocator(CompositionContainer);

2: ServiceLocator.SetLocatorProvider(() => locator);


Дата добавления: 2015-08-13; просмотров: 194 | Нарушение авторских прав


Читайте в этой же книге: Шаг 4. View | Шаг 4. Редактирование | Шаг 5. Команды | Создание ссылок на XAML файлы | Синхронное использование XAML | Отсутствие метода OverrideMetadata() | Отсутствие свойства No PathSegment.IsStroked | Краткие итоги | Задача 3. | Принцип инверсии зависимостей |
<== предыдущая страница | следующая страница ==>
Формы инверсии зависимостей| Сопоставление модели представления и представления

mybiblioteka.su - 2015-2024 год. (0.014 сек.)