Your SlideShare is downloading. ×
IoC & Dependency Injection
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

IoC & Dependency Injection

189
views

Published on

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
189
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Dependency Injection, IoC
  • 2. ПланIoC принципDependency injectionКак не стоит определять зависимостиПростой пример
  • 3. ТерминыСервис - объект, который может выполняет какую-либотребуемую функциюКлиент - тот, кто использует сервисЗависимость - сервис, который требуется другому объектудля выполнения каких-либо функцийЗависимый - объект, которому нужен сервис для того,чтобы выполнять какие-либо возложенные на него функции
  • 4. IoC, истокиpublic class Reporter{     public void SendReports()     {        var reportBuilder = newReportBuilder();        var report =reportBuilder.CreateReport();        var reportSender = newEmailReportSender();        reportSender.Send(report);    }}
  • 5. Что хорошего?Это просто
  • 6. Что плохого?Это нетестируемоЭто сильное связывание, котороеприводит к монолитности OODВ итоге это превращается в ад
  • 7. Эволюцияpublic class Reporter{     public void SendReports()     {        var reportBuilder =ServiceLocator.ReportBuilder;        var report =reportBuilder.CreateReport();        var reportSender =ServiceLocator.ReportSender;        reportSender.Send(report);    }}
  • 8. Стало лучше, но...Мы должны поддерживать ServiceLocatorЗависимый объект всё равноопределяет свои зависимости внутриреализацииЗависимости неочевидны
  • 9. IoC approachpublic class Reporter{ private readonly IReportBuilder _builder; private readonly IReportSender _sender; public Reporter(IReportBuilder builder, IReportSender sender) { _builder = builder; _sender = sender; }     public void SendReports()     {        var report = _builder.CreateReport();        _sender.Send(report);    }}
  • 10. IoC approachReportSender не может определить своизависимости самостоятельноЗависимости очевидныТестировать прощеСлабосвязанная архитектура
  • 11. DI with IoC containersОтветсвенность за внедрениезависимостей перекладывается наспециальный фреймворк (IoC container)Зависимости конфигурируются в кодеили конфиг-файлах
  • 12. DI with IoC containersvar reporter = container.Get<Reporter>();reporter.SendReports();
  • 13. Антипаттерны IoCControl FreakBastard injectionConstrained injectionService locatorProperty injection *
  • 14. Control Freak /Диктатор-наркоман :) public class Reporter {      public void SendReports()      {         var reportBuilder = new ReportBuilder();         var report = reportBuilder.CreateReport();         var reportSender = new EmailReportSender();         reportSender.Send(report);     } }
  • 15. Bastard injection /внебрачные зависимости public class Reporter { private readonly IReportBuilder _builder; private readonly IReportSender _sender; public Reporter(IReportBuilder builder, IReportSender sender) { _builder = builder; _sender = sender; } public Reporter() this(ReportBuilder.GetDefaultBuilder(), ReportSender.GetDefaultSender()) { _builder = builder; _sender = sender; } }
  • 16. Constrained construction / ограниченное построениеType bulderType = GetBuilderType();Type senderType = GetSenderType();Reporter reporter =Activator.CreateInstance(typeof(Reporter), builderType, senderType);
  • 17. Service locatorpublic class Reporter{     public void SendReports()     {        var reportBuilder =ServiceLocator.Get<IReportBuilder>();        var report =reportBuilder.CreateReport();        var reportSender =ServiceLocator.Get<IReportSender>();        reportSender.Send(report);    }}
  • 18. Property injection *Не антипаттерн в класическом понимании, нотребует осторожностиИспользуйте только тогда, когда этодейтствительно нужно (какой-либо фреймворктребует конструктор без параметров)Используйте тогда, когда поведение объктаменяется во время выполнения
  • 19. Property injection *public class Reporter{ public IReportBuilder Builder { get;set; } public IReportSender Sender { get;set; }     public void SendReports()     {        var report = Builder.CreateReport();        Sender.Send(report);    }}
  • 20. Property injection *Можно изменить зависимости во времявыполнения (например, при смененастроек без перезапуска приложения)Если забыть определить зависимости, тополучим исключение на этапевыполнения
  • 21. .NET DI/IoC frameworks Unity Ninject Autofac StructureMap Castle Windsor

×