SlideShare a Scribd company logo
Меня зовут Илья, я занимаюсь разработкой с использованием .Net в
компании Luxoft.
efimilya@gmail.com
+7 910 900 4727
Сложность разрабатываемых систем и количество унаследованного
кода заставляют использовать инструменты и подходы.
IoC/DI в этом очень помогает.
1
IoC/DI на примере Autofac
2
Объектно-ориентированный дизайн включает
1. Создание экземпляра
2. Передача его потребителю
3. Управление временем жизни
4. Бизнес-логика
5. Очистка ненужного экземпляра
IoC-контейнер берет на себя 1, 2, 3, 5
3
1. Что такое IoC? В чем инверсия?
2. В чем преимущества IoC/DI?
3. Как это связано с буквой D из SOLID?
4. Что такое вложенные контейнеры?
5. IDisposable и IoC-контейнеры.
6. Автоматические фабрики.
4
5
Root
Root IoC-container
Без IoC/ID с IoC/ID
6
Object A Object B
ссылается
Object A Object B
Реализует
InterfaceA
ссылается
 Регистрация зависимостей в отдельных контейнерах.
 Которые могут брать зависимости из родительских контейнеров.
 Регистритрация зависимостей, параметризованных данными времени
выполнения.
 Поэтому не придется обходиться с этими данными вручную
(передавать в качестве параметров).
 Компоненты не могут иметь доступ друг к другу во время выполнения.
 Можно освободить ресурсы, вызвав Dispose вложенного контейнера.
7
Задача для фронэнда:
8
Первое решение.
 Вся регистрация в одном контейнере.
 Создание экземпляр дочернего окна явно через
конструктор.
 Передача ему нужных зависимостей (исходя из
введенных пользователем данных).
9
Плюсы:
 Мы решили задачу
 Зависимости (за исключение одной) мы разрешили
через контейнер.
10
Минусы:
 Одну из зависимостей создана через new.
 Противоречит IoC/DI.
 Не сможем использовать очистку.
 Если увеличится количество компонентов,
увеличится сложность решения.
11
Второе решение
 Использование вложенных скоупов.
 Регистрация зависимостей в отдельных
контейнерах.
 Вложенный контейнер конфигурируются на
момент выполнения.
12
Минусы:
 На первый взгляд это может показаться довольно
сложным и запутанным приемом (издержки
подхода)
13
Плюсы:
 Нет ни одного оператора new.
 Простая регистрация и разрешение зависимостей.
14
Задача усложнилась.
 Добавились новые требования.
 Стало больше компонентов.
 Контекстно-зависимые компоненты распологаются
глубоко относительно ChildWindowViewModel
 Поэтому создание ее экземпляра становится сложным.
15
Первому решению плюсов не добавилось. Минусы усугубились:
builder.Register<ChildWindowViewModelFactory>(
context =>
{
var parentContext = context.Persist();
return speaker =>
new ChildWindowViewModel(
GetSpeaker(speaker, parentContext), new ChildHeaderViewModel(
new HeaderTextFormatter(
GetFormatHeaderStrategy(speaker, parentContext)),
parentContext.Resolve<HeaderTextProvider>()));
});
16
 Второе решение не усложнилось
 Добавилась всего-лишь регистрация новых компонентов
17
Задача для бекэнда:
 Обслужить запрос пользователя.
 А именно: загрузить исходные данные.
 На их основе произвести вычисления.
18
Первое решение.
 Регистрация всех компонентов в одном
контейнере.
 Передача зависимостей через параметры методов.
19
Плюсы:
 Задача решена.
 Выглядит несложно.
20
Минусы:
 Приходится часто передавать параметры методам.
public int Calculate(int customerId, int programId, string operationName)
{
var customer = _customerRepository.Get(customerId);
var program = _programRepository.Get(programId);
var operation = _operationRepository.Get(operationName);
return _firstStepAggregator.Aggregate(customer, program, operation) +
_secondStepAggregator.Aggregate(customer, program, operation);
}
public int Aggregate(Customer customer, Program program, Operation operation)
{
return (_customerHandler.Handle(customer) +
_programHandler.Handle(program) +
_operationHandler.Handle(operation)) * _globalServiceData.Value;
}
21
Второе решение
 Использовать вложенные контейнеры.
 Контейнер занимается передачей зависимостей.
22
Минусы
 Регистрация чуть сложнее (издержки подхода)
23
Плюсы:
 Данные, которые мы передавали в качестве параметров,
теперь зарегестрированы в контейнере и получать к ним
доступ очень просто.
 Методы стали намного проще по сигнатуре.
public int Calculate()
{
return _firstStepAggregator.Aggregate() +
_secondStepAggregator.Aggregate();
}
public int Aggregate()
{
return (_customerHandler.Handle() +
_programHandler.Handle() +
_operationHandler.Handle()) * _globalServiceData.Value;
}
24
 Порой нужна очистка.
 Контейнер умеет вызывать Dispose() зависимостей.
 Удобно использоватьCompositeDisposable и
Disposable<T>
25
Disposable<T>
принимает два параметра:
 T value
 Action disposeAction
26
CompositeDisposable
 Контейнер для элементов IDisposable.
 Очистка нескольких компонентов за раз.
 Удобно, например, для отписки от событий.
27
 Func<int, string, … ,T>
 Создание экземпляров, которые на вход
принимают загерестрированные зависимости, а
также произвольные параметры.
 Экземпляр создан через контейнер, а значит мы
получаем все преимущества контейнера (передача
зависимостей, управление временем жизни и
очистка).
28
 IoC/DI делает часть работы за нас.
 Помогает упростить объектно-ориентированный
дизайн.
 Autofac поддерживает вложенные контейнеры.
 А также автоматические фабрики.
29
 Книга Марка Симана - внедрение зависимостей в .net
 Документация Autofac
 Исходный код презентации
 Статья Удобное создание Composition Root с помощью
Autofac
 Статья Самая простая и надежная реализация Статья шаблона
проектирования Dispose
 Статья Disposable без границ
30

More Related Content

Viewers also liked

Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
MskDotNet Community
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
MskDotNet Community
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
Yulia Tsisyk
 
Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений» Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Yulia Tsisyk
 
10 E-Learning Trends to watch in 2016
10 E-Learning Trends to watch in 201610 E-Learning Trends to watch in 2016
10 E-Learning Trends to watch in 2016
Aurion Learning
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
Seth Familian
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
Drift
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
Leslie Samuel
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
SlideShare
 
What to Upload to SlideShare
What to Upload to SlideShareWhat to Upload to SlideShare
What to Upload to SlideShare
SlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
SlideShare
 

Viewers also liked (12)

Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
 
Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений» Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
10 E-Learning Trends to watch in 2016
10 E-Learning Trends to watch in 201610 E-Learning Trends to watch in 2016
10 E-Learning Trends to watch in 2016
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
 
What to Upload to SlideShare
What to Upload to SlideShareWhat to Upload to SlideShare
What to Upload to SlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Similar to Илья Ефимов «IoC/DI на примере Autofac»

Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
Magecom UK Limited
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
Denis Tsvettsih
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
Dev2Dev
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
Alexander Byndyu
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
Yandex
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
Yandex
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
GoSharp
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
Roman Dvornov
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
Illya Klymov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''DneprCiklumEvents
 
Egor Fedorov "Behavior-driven development in Python"
Egor Fedorov "Behavior-driven development in Python"Egor Fedorov "Behavior-driven development in Python"
Egor Fedorov "Behavior-driven development in Python"
Fwdays
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
Dima Dzuba
 
Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в коде
Alexander Byndyu
 
Cyber Bionics #iotconfua
Cyber Bionics #iotconfuaCyber Bionics #iotconfua
Cyber Bionics #iotconfua
Andy Shutka
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
Igor Shkulipa
 
Effective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEAEffective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEAchashnikov
 

Similar to Илья Ефимов «IoC/DI на примере Autofac» (20)

Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за од...
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Tdd php
Tdd phpTdd php
Tdd php
 
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
 
Egor Fedorov "Behavior-driven development in Python"
Egor Fedorov "Behavior-driven development in Python"Egor Fedorov "Behavior-driven development in Python"
Egor Fedorov "Behavior-driven development in Python"
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в коде
 
Cyber Bionics #iotconfua
Cyber Bionics #iotconfuaCyber Bionics #iotconfua
Cyber Bionics #iotconfua
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
Effective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEAEffective coding in IntelliJ IDEA
Effective coding in IntelliJ IDEA
 

More from MskDotNet Community

Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»
MskDotNet Community
 
Николай Гусев «Функциональное программирование для C# разработчиков»
 Николай Гусев «Функциональное программирование для C# разработчиков» Николай Гусев «Функциональное программирование для C# разработчиков»
Николай Гусев «Функциональное программирование для C# разработчиков»
MskDotNet Community
 
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
MskDotNet Community
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
MskDotNet Community
 
Владимир Кочетков "OWASP TOP 10 для.NET"
Владимир Кочетков  "OWASP TOP 10 для.NET"Владимир Кочетков  "OWASP TOP 10 для.NET"
Владимир Кочетков "OWASP TOP 10 для.NET"
MskDotNet Community
 
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиковДмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
MskDotNet Community
 
Викторина MskDotNet Субботник
Викторина MskDotNet СубботникВикторина MskDotNet Субботник
Викторина MskDotNet Субботник
MskDotNet Community
 
Елизавета Голенок Переходим на mono или как это было
Елизавета Голенок  Переходим на mono или как это былоЕлизавета Голенок  Переходим на mono или как это было
Елизавета Голенок Переходим на mono или как это было
MskDotNet Community
 
Иван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языковИван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языков
MskDotNet Community
 
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
MskDotNet Community
 
Павел Притчин "Конфигурации в.NET"
Павел Притчин  "Конфигурации в.NET"Павел Притчин  "Конфигурации в.NET"
Павел Притчин "Конфигурации в.NET"
MskDotNet Community
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
MskDotNet Community
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
MskDotNet Community
 
Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"
MskDotNet Community
 
Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»
MskDotNet Community
 
Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»
MskDotNet Community
 
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
MskDotNet Community
 

More from MskDotNet Community (17)

Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»
 
Николай Гусев «Функциональное программирование для C# разработчиков»
 Николай Гусев «Функциональное программирование для C# разработчиков» Николай Гусев «Функциональное программирование для C# разработчиков»
Николай Гусев «Функциональное программирование для C# разработчиков»
 
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Владимир Кочетков "OWASP TOP 10 для.NET"
Владимир Кочетков  "OWASP TOP 10 для.NET"Владимир Кочетков  "OWASP TOP 10 для.NET"
Владимир Кочетков "OWASP TOP 10 для.NET"
 
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиковДмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
 
Викторина MskDotNet Субботник
Викторина MskDotNet СубботникВикторина MskDotNet Субботник
Викторина MskDotNet Субботник
 
Елизавета Голенок Переходим на mono или как это было
Елизавета Голенок  Переходим на mono или как это былоЕлизавета Голенок  Переходим на mono или как это было
Елизавета Голенок Переходим на mono или как это было
 
Иван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языковИван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языков
 
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
 
Павел Притчин "Конфигурации в.NET"
Павел Притчин  "Конфигурации в.NET"Павел Притчин  "Конфигурации в.NET"
Павел Притчин "Конфигурации в.NET"
 
Андрей Кирпичев "Гибкая модульность инструментами АОП"
Андрей Кирпичев  "Гибкая модульность инструментами АОП"Андрей Кирпичев  "Гибкая модульность инструментами АОП"
Андрей Кирпичев "Гибкая модульность инструментами АОП"
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 
Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"
 
Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»
 
Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»
 
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
 

Илья Ефимов «IoC/DI на примере Autofac»

  • 1. Меня зовут Илья, я занимаюсь разработкой с использованием .Net в компании Luxoft. efimilya@gmail.com +7 910 900 4727 Сложность разрабатываемых систем и количество унаследованного кода заставляют использовать инструменты и подходы. IoC/DI в этом очень помогает. 1
  • 3. Объектно-ориентированный дизайн включает 1. Создание экземпляра 2. Передача его потребителю 3. Управление временем жизни 4. Бизнес-логика 5. Очистка ненужного экземпляра IoC-контейнер берет на себя 1, 2, 3, 5 3
  • 4. 1. Что такое IoC? В чем инверсия? 2. В чем преимущества IoC/DI? 3. Как это связано с буквой D из SOLID? 4. Что такое вложенные контейнеры? 5. IDisposable и IoC-контейнеры. 6. Автоматические фабрики. 4
  • 6. 6 Object A Object B ссылается Object A Object B Реализует InterfaceA ссылается
  • 7.  Регистрация зависимостей в отдельных контейнерах.  Которые могут брать зависимости из родительских контейнеров.  Регистритрация зависимостей, параметризованных данными времени выполнения.  Поэтому не придется обходиться с этими данными вручную (передавать в качестве параметров).  Компоненты не могут иметь доступ друг к другу во время выполнения.  Можно освободить ресурсы, вызвав Dispose вложенного контейнера. 7
  • 9. Первое решение.  Вся регистрация в одном контейнере.  Создание экземпляр дочернего окна явно через конструктор.  Передача ему нужных зависимостей (исходя из введенных пользователем данных). 9
  • 10. Плюсы:  Мы решили задачу  Зависимости (за исключение одной) мы разрешили через контейнер. 10
  • 11. Минусы:  Одну из зависимостей создана через new.  Противоречит IoC/DI.  Не сможем использовать очистку.  Если увеличится количество компонентов, увеличится сложность решения. 11
  • 12. Второе решение  Использование вложенных скоупов.  Регистрация зависимостей в отдельных контейнерах.  Вложенный контейнер конфигурируются на момент выполнения. 12
  • 13. Минусы:  На первый взгляд это может показаться довольно сложным и запутанным приемом (издержки подхода) 13
  • 14. Плюсы:  Нет ни одного оператора new.  Простая регистрация и разрешение зависимостей. 14
  • 15. Задача усложнилась.  Добавились новые требования.  Стало больше компонентов.  Контекстно-зависимые компоненты распологаются глубоко относительно ChildWindowViewModel  Поэтому создание ее экземпляра становится сложным. 15
  • 16. Первому решению плюсов не добавилось. Минусы усугубились: builder.Register<ChildWindowViewModelFactory>( context => { var parentContext = context.Persist(); return speaker => new ChildWindowViewModel( GetSpeaker(speaker, parentContext), new ChildHeaderViewModel( new HeaderTextFormatter( GetFormatHeaderStrategy(speaker, parentContext)), parentContext.Resolve<HeaderTextProvider>())); }); 16
  • 17.  Второе решение не усложнилось  Добавилась всего-лишь регистрация новых компонентов 17
  • 18. Задача для бекэнда:  Обслужить запрос пользователя.  А именно: загрузить исходные данные.  На их основе произвести вычисления. 18
  • 19. Первое решение.  Регистрация всех компонентов в одном контейнере.  Передача зависимостей через параметры методов. 19
  • 20. Плюсы:  Задача решена.  Выглядит несложно. 20
  • 21. Минусы:  Приходится часто передавать параметры методам. public int Calculate(int customerId, int programId, string operationName) { var customer = _customerRepository.Get(customerId); var program = _programRepository.Get(programId); var operation = _operationRepository.Get(operationName); return _firstStepAggregator.Aggregate(customer, program, operation) + _secondStepAggregator.Aggregate(customer, program, operation); } public int Aggregate(Customer customer, Program program, Operation operation) { return (_customerHandler.Handle(customer) + _programHandler.Handle(program) + _operationHandler.Handle(operation)) * _globalServiceData.Value; } 21
  • 22. Второе решение  Использовать вложенные контейнеры.  Контейнер занимается передачей зависимостей. 22
  • 23. Минусы  Регистрация чуть сложнее (издержки подхода) 23
  • 24. Плюсы:  Данные, которые мы передавали в качестве параметров, теперь зарегестрированы в контейнере и получать к ним доступ очень просто.  Методы стали намного проще по сигнатуре. public int Calculate() { return _firstStepAggregator.Aggregate() + _secondStepAggregator.Aggregate(); } public int Aggregate() { return (_customerHandler.Handle() + _programHandler.Handle() + _operationHandler.Handle()) * _globalServiceData.Value; } 24
  • 25.  Порой нужна очистка.  Контейнер умеет вызывать Dispose() зависимостей.  Удобно использоватьCompositeDisposable и Disposable<T> 25
  • 27. CompositeDisposable  Контейнер для элементов IDisposable.  Очистка нескольких компонентов за раз.  Удобно, например, для отписки от событий. 27
  • 28.  Func<int, string, … ,T>  Создание экземпляров, которые на вход принимают загерестрированные зависимости, а также произвольные параметры.  Экземпляр создан через контейнер, а значит мы получаем все преимущества контейнера (передача зависимостей, управление временем жизни и очистка). 28
  • 29.  IoC/DI делает часть работы за нас.  Помогает упростить объектно-ориентированный дизайн.  Autofac поддерживает вложенные контейнеры.  А также автоматические фабрики. 29
  • 30.  Книга Марка Симана - внедрение зависимостей в .net  Документация Autofac  Исходный код презентации  Статья Удобное создание Composition Root с помощью Autofac  Статья Самая простая и надежная реализация Статья шаблона проектирования Dispose  Статья Disposable без границ 30