SlideShare a Scribd company logo
1 of 27
Предпосылки появления DI-контейнеров Уральская группа пользователей .NET, март 2010 Павел Егоров, СКБ Контур  pe@skbkontur.ru http://xoposhiy.livejournal.com
S RP — Single Responsibility Principle O CP — Open Closed Principle L SP — Liskov Substitution Principle I SP — Interface Segregation Principle D IP — Dependency Inversion Principle
— Хотим спроектировать хорошо! — Быть готовым к грядущим изменениям!
S RP — Single Responsibility Principle O Модуль =  = одна обязанность =  = одна причина изменения L I D пихать все в один класс — НЕТ! :-br />плодить много мелких классов— ДА :-)
Iso8859Decoder Utf8Decoder Invoice Converter SRP всех вылечит! :-)
Iso8859Decoder Utf8Decoder Invoice Converter void Convert() { var decoder = new Iso8859Decoder();     … decoder.Decode(…);     … }
Классы должны зависеть от интерфейсов, а не от других классов. IDecoder Invoice Converter S O L Iso8859Decoder Utf8Decoder … I DIP — Dependency Inversion Principle
publicInvoiceConverter( IDecoder decoder) { this.decoder = decoder; } … publicvoid Convert() {     … decoder.Decode(…);     … } IDecoder Invoice Converter Utf8Decoder Iso8859Decoder new InvoiceConverter( new Iso8859Decoder()); или new InvoiceConverter( new Utf8Decoder()); SRP + DIP всех вылечат! :-)
SRP DIP реализация интерфейса использование
— Давайте жестко разделять: MiškoHevery misko.hevery.com код, содержащий  логику программы код, вызывающий конструкторы new A(new B(…), new C(…)) … new SmtpClient(smtpUrl); … new ConsoleLogger() …
IService Locator
ServiceLocator
ServiceLocator    зависимости стали неявными… хрупкость!
ServiceLocator
ServiceLocator все зависят от ServiceLocator’а жесткость!
MiškoHevery misko.hevery.com
более100сервисов Rule of thumb: 1 сервис на каждые  5-7 килобайт кода Электронный бухгалтер Действительно МНОГО серого тупого рутинного кода
время жизни Автоматический поиск всех типов с каждой новой «фичей» будет все хуже… Ленивая инициализация, коллекции, один объект на несколько интерфейсов,  xml-конфигурирование, IDisposable, дочерние контейнеры, …
←  ServiceLocator
ServiceLocator
модуль AJAX подсказок Conventions over  configuration (via RoboContainer) Windsor container xml-конфигурирование  <castle>         <components>             <component id="JsonSerializer"                                          service="SKBKontur.IB.Serialization.IDataSerializer, IB.Serialization"                                          type="SKBKontur.IB.Serialization.JsonSerializer, IB.Serialization">             </component>             <component id="BankReferenceSource" lifestyle="singleton"                          service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts]], IB.ReferenceService"                          type="SKBKontur.IB.ReferenceService.Bank.BankReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="BankReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Bank.BankReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="BankReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService"                                  >             </component>             <component id="BankReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Bank.BankReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>             <component id="LocationReferenceSource" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="LocationReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="LocationReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts, Version=1.0.0.0, Culture=neutral], [System.String]], IB.ReferenceService"                                  >             </component>             <component id="LocationReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>             <component id="StreetReferenceSource" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="StreetReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="StreetReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService, Version=1.0.0.0, Culture=neutral]], IB.ReferenceService"                                  >             </component>             <component id="StreetReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>             <component id="HouseReferenceSource" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="HouseReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="HouseReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService, Version=1.0.0.0, Culture=neutral]], IB.ReferenceService"                                  >             </component>             <component id="HouseReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>             <component id="IFNSReferenceSource" lifestyle="singleton"                          service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts]], IB.ReferenceService"                          type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="IFNSReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="IFNSReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService"                                  >             </component>             <component id="IFNSReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>             <component id="RegionReferenceSource" lifestyle="singleton"                          service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService]], IB.ReferenceService"                          type="SKBKontur.IB.ReferenceService.Region.RegionReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"                                  >             </component>             <component id="RegionReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Region.RegionReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="RegionReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                                  >             </component>             <component id="VKTMOReferenceSource" lifestyle="singleton"                              service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService]], IB.ReferenceService"                              type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral">             </component>             <component id="VKTMOReferenceImplementation" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceImplementation, IB.ReferenceService"                                  >             </component>             <component id="VKTMOReference" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService"                                  >             </component>             <component id="VKTMOReferenceWriter" lifestyle="singleton"                      service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService"                      type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceServiceWriter, IB.ReferenceService"                                  >                 <parameters>                     <dataSerializer>${JsonSerializer}</dataSerializer>                 </parameters>             </component>         </components>     </castle> Электронный бухгалтер 3 строки конфигурирования 2 из которых «не по делу»  и сигнализируют о «мертвом», неиспользуемом коде. Disclaimer Используя Windsorcontainer тоже можно практиковать подход Convention over Configuration! Наверное… 160строк, 11 Кб
Подытожим Наш проект ждут изменения. SRP+DIP дают нам защиту от изменений, но… …принуждают к тому, чтобы писать много мелких классов. Из мелких классов где-то нужно собирать граф объектов. Контейнеры всего лишь упрощают эту сборку. А с convention over configuration упрощают радикально! Вопросы
Но будет много противных аргументов конструктора! обычно бывает так: а вовсе не так: — Аргументов будет мало, это я вам гарантирую! ;-) секретный слайд
Может быть конфигурировать в конструкторе? задавать через GUI не загружать дважды секретный слайд
Conventions — это путь к хрупкости Ошибки секретный слайд
Robert C. Martin objectmentor.com Design Principles and Design Patterns http://objectmentor.com/resources/articles/Principles_and_Patterns.pdf
rigidity viscosity нетехнологичность жесткость …проще сделать «в обход» …надо много переделывать Дизайн плох, если… [когда приходит новая задача] …использовать готовое  решение не получается …трогать код опасно! хрупкость немобильность fragility immobility

More Related Content

Viewers also liked

Actualog Social Product Information Management
Actualog Social Product Information ManagementActualog Social Product Information Management
Actualog Social Product Information ManagementKate Koltunova
 
Интеллект-карты для конспектирования
Интеллект-карты для конспектированияИнтеллект-карты для конспектирования
Интеллект-карты для конспектированияPavel Egorov
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Pavel Egorov
 
Разработка ПО. Введение в специальность 1
Разработка ПО. Введение в специальность 1Разработка ПО. Введение в специальность 1
Разработка ПО. Введение в специальность 1Pavel Egorov
 
Разработка ПО. Введение в специальность 3. Требования
 Разработка ПО. Введение в специальность 3. Требования Разработка ПО. Введение в специальность 3. Требования
Разработка ПО. Введение в специальность 3. ТребованияPavel Egorov
 
Highload в контуре @ DUMP 2011
Highload в контуре @ DUMP 2011Highload в контуре @ DUMP 2011
Highload в контуре @ DUMP 2011Pavel Egorov
 
Software engineering. Введение в специальность. Обзор
Software engineering. Введение в специальность. ОбзорSoftware engineering. Введение в специальность. Обзор
Software engineering. Введение в специальность. ОбзорPavel Egorov
 
Машинное обучение (Открытый семинар по средам)
Машинное обучение (Открытый семинар по средам)Машинное обучение (Открытый семинар по средам)
Машинное обучение (Открытый семинар по средам)Pavel Egorov
 
Software Engineering. Введение в специальность. Что дальше?
Software Engineering. Введение в специальность. Что дальше?Software Engineering. Введение в специальность. Что дальше?
Software Engineering. Введение в специальность. Что дальше?Pavel Egorov
 
Software engineering. Введение в специальность. Проектирование, требования
Software engineering. Введение в специальность. Проектирование, требованияSoftware engineering. Введение в специальность. Проектирование, требования
Software engineering. Введение в специальность. Проектирование, требованияPavel Egorov
 
Highload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыHighload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыPavel Egorov
 

Viewers also liked (12)

Actualog Social Product Information Management
Actualog Social Product Information ManagementActualog Social Product Information Management
Actualog Social Product Information Management
 
Интеллект-карты для конспектирования
Интеллект-карты для конспектированияИнтеллект-карты для конспектирования
Интеллект-карты для конспектирования
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
IT strategy
IT strategyIT strategy
IT strategy
 
Разработка ПО. Введение в специальность 1
Разработка ПО. Введение в специальность 1Разработка ПО. Введение в специальность 1
Разработка ПО. Введение в специальность 1
 
Разработка ПО. Введение в специальность 3. Требования
 Разработка ПО. Введение в специальность 3. Требования Разработка ПО. Введение в специальность 3. Требования
Разработка ПО. Введение в специальность 3. Требования
 
Highload в контуре @ DUMP 2011
Highload в контуре @ DUMP 2011Highload в контуре @ DUMP 2011
Highload в контуре @ DUMP 2011
 
Software engineering. Введение в специальность. Обзор
Software engineering. Введение в специальность. ОбзорSoftware engineering. Введение в специальность. Обзор
Software engineering. Введение в специальность. Обзор
 
Машинное обучение (Открытый семинар по средам)
Машинное обучение (Открытый семинар по средам)Машинное обучение (Открытый семинар по средам)
Машинное обучение (Открытый семинар по средам)
 
Software Engineering. Введение в специальность. Что дальше?
Software Engineering. Введение в специальность. Что дальше?Software Engineering. Введение в специальность. Что дальше?
Software Engineering. Введение в специальность. Что дальше?
 
Software engineering. Введение в специальность. Проектирование, требования
Software engineering. Введение в специальность. Проектирование, требованияSoftware engineering. Введение в специальность. Проектирование, требования
Software engineering. Введение в специальность. Проектирование, требования
 
Highload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексыHighload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексы
 

Основы Di контейнеров

  • 1. Предпосылки появления DI-контейнеров Уральская группа пользователей .NET, март 2010 Павел Егоров, СКБ Контур pe@skbkontur.ru http://xoposhiy.livejournal.com
  • 2. S RP — Single Responsibility Principle O CP — Open Closed Principle L SP — Liskov Substitution Principle I SP — Interface Segregation Principle D IP — Dependency Inversion Principle
  • 3. — Хотим спроектировать хорошо! — Быть готовым к грядущим изменениям!
  • 4. S RP — Single Responsibility Principle O Модуль = = одна обязанность = = одна причина изменения L I D пихать все в один класс — НЕТ! :-br />плодить много мелких классов— ДА :-)
  • 5. Iso8859Decoder Utf8Decoder Invoice Converter SRP всех вылечит! :-)
  • 6. Iso8859Decoder Utf8Decoder Invoice Converter void Convert() { var decoder = new Iso8859Decoder(); … decoder.Decode(…); … }
  • 7. Классы должны зависеть от интерфейсов, а не от других классов. IDecoder Invoice Converter S O L Iso8859Decoder Utf8Decoder … I DIP — Dependency Inversion Principle
  • 8. publicInvoiceConverter( IDecoder decoder) { this.decoder = decoder; } … publicvoid Convert() { … decoder.Decode(…); … } IDecoder Invoice Converter Utf8Decoder Iso8859Decoder new InvoiceConverter( new Iso8859Decoder()); или new InvoiceConverter( new Utf8Decoder()); SRP + DIP всех вылечат! :-)
  • 9. SRP DIP реализация интерфейса использование
  • 10. — Давайте жестко разделять: MiškoHevery misko.hevery.com код, содержащий логику программы код, вызывающий конструкторы new A(new B(…), new C(…)) … new SmtpClient(smtpUrl); … new ConsoleLogger() …
  • 13. ServiceLocator зависимости стали неявными… хрупкость!
  • 15. ServiceLocator все зависят от ServiceLocator’а жесткость!
  • 17. более100сервисов Rule of thumb: 1 сервис на каждые 5-7 килобайт кода Электронный бухгалтер Действительно МНОГО серого тупого рутинного кода
  • 18. время жизни Автоматический поиск всех типов с каждой новой «фичей» будет все хуже… Ленивая инициализация, коллекции, один объект на несколько интерфейсов, xml-конфигурирование, IDisposable, дочерние контейнеры, …
  • 21. модуль AJAX подсказок Conventions over configuration (via RoboContainer) Windsor container xml-конфигурирование <castle> <components> <component id="JsonSerializer" service="SKBKontur.IB.Serialization.IDataSerializer, IB.Serialization" type="SKBKontur.IB.Serialization.JsonSerializer, IB.Serialization"> </component> <component id="BankReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Bank.BankReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="BankReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Bank.BankReferenceImplementation, IB.ReferenceService" > </component> <component id="BankReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.BankInfo, IB.DataContracts], [System.String]], IB.ReferenceService" > </component> <component id="BankReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Bank.BankReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> <component id="LocationReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="LocationReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceImplementation, IB.ReferenceService" > </component> <component id="LocationReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.Address.LocationInfo, IB.DataContracts, Version=1.0.0.0, Culture=neutral], [System.String]], IB.ReferenceService" > </component> <component id="LocationReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Location.LocationReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> <component id="StreetReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="StreetReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceImplementation, IB.ReferenceService" > </component> <component id="StreetReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.KLADR.Street.StreetInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceSearchParams, IB.ReferenceService, Version=1.0.0.0, Culture=neutral]], IB.ReferenceService" > </component> <component id="StreetReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.Street.StreetReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> <component id="HouseReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="HouseReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceImplementation, IB.ReferenceService" > </component> <component id="HouseReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.KLADR.House.HouseInfo, IB.ReferenceService], [SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceSearchParams, IB.ReferenceService, Version=1.0.0.0, Culture=neutral]], IB.ReferenceService" > </component> <component id="HouseReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.KLADR.House.HouseReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> <component id="IFNSReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="IFNSReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceImplementation, IB.ReferenceService" > </component> <component id="IFNSReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.DataContracts.IFNSInfo, IB.DataContracts], [SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceSearchParams, IB.ReferenceService]], IB.ReferenceService" > </component> <component id="IFNSReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.IFNS.IFNSReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> <component id="RegionReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Region.RegionReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral" > </component> <component id="RegionReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Region.RegionReferenceImplementation, IB.ReferenceService" > </component> <component id="RegionReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.Region.RegionInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" > </component> <component id="VKTMOReferenceSource" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceSource`1[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceSource, IB.ReferenceService, Version=1.0.0.0, Culture=neutral"> </component> <component id="VKTMOReferenceImplementation" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceImplementation`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceImplementation, IB.ReferenceService" > </component> <component id="VKTMOReference" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReference`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" type="SKBKontur.IB.ReferenceService.Reference`2[[SKBKontur.IB.ReferenceService.VKTMO.VKTMOInfo, IB.ReferenceService], [System.String]], IB.ReferenceService" > </component> <component id="VKTMOReferenceWriter" lifestyle="singleton" service="SKBKontur.IB.ReferenceService.IReferenceServiceWriter, IB.ReferenceService" type="SKBKontur.IB.ReferenceService.VKTMO.VKTMOReferenceServiceWriter, IB.ReferenceService" > <parameters> <dataSerializer>${JsonSerializer}</dataSerializer> </parameters> </component> </components> </castle> Электронный бухгалтер 3 строки конфигурирования 2 из которых «не по делу» и сигнализируют о «мертвом», неиспользуемом коде. Disclaimer Используя Windsorcontainer тоже можно практиковать подход Convention over Configuration! Наверное… 160строк, 11 Кб
  • 22. Подытожим Наш проект ждут изменения. SRP+DIP дают нам защиту от изменений, но… …принуждают к тому, чтобы писать много мелких классов. Из мелких классов где-то нужно собирать граф объектов. Контейнеры всего лишь упрощают эту сборку. А с convention over configuration упрощают радикально! Вопросы
  • 23. Но будет много противных аргументов конструктора! обычно бывает так: а вовсе не так: — Аргументов будет мало, это я вам гарантирую! ;-) секретный слайд
  • 24. Может быть конфигурировать в конструкторе? задавать через GUI не загружать дважды секретный слайд
  • 25. Conventions — это путь к хрупкости Ошибки секретный слайд
  • 26. Robert C. Martin objectmentor.com Design Principles and Design Patterns http://objectmentor.com/resources/articles/Principles_and_Patterns.pdf
  • 27. rigidity viscosity нетехнологичность жесткость …проще сделать «в обход» …надо много переделывать Дизайн плох, если… [когда приходит новая задача] …использовать готовое решение не получается …трогать код опасно! хрупкость немобильность fragility immobility