IoC & Dependency Injection

417 views

Published on

Published in: Technology
  • Be the first to comment

IoC & Dependency Injection

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

×