Thursday, February 18, 2010

DI и IoC для начинающих

Тема DI/IoC достаточно простая, но в сети очень сложно найти хорошее описание того, как это работает и зачем это нужно. Вот моя попытка, с использованием Unity. Хорошо ли объяснена тема – судить вам.


Давайте создадим простенький пример:

   // сервис. содержит бизнес-логику
   public class MyService
   {
     public MyService()
     {
       ⋮
     }
     public void DoSomething()
     {
       ⋮
     }
   }
   
   // окошко. пользуется бизнес-логикой
   public class MyWindow : Form
   {
     private MyService service;
     public MyWindow()
     {
       service = new MyService();
     }
   }
   
   // програмка которая показывает окошко
   public class MyProgram
   {
     static void Main()
     {
       ⋮
       /// создаем окно
       Application.Run(new MyWindow);
     }
   }

В этом коде одна проблема: класс MyWindow слишком сильно привязан к классу MyService. Это плохо потому что

   * Не получится написать unit-тест для MyWindow в отрыве от MyService. Фактически получится интеграционный тест.
   * Невозможно заменить MyService на OtherService, если только OtherService от него не наследует. Если от MyService зависят несколько классов, придется менять их все.
   * Если наш сервис требует настройки, его придется настраивать в каждом классе, который его использует.


Если коротко, то наша проблема – это operator new(). Чтобы грамотно контролировать зависимости и позволить себе тестировать объекты в изоляции, от этого оператора нужно отказаться.


Read more: habrahabr.ru Part 1, Part 2, Part 3

Posted via email from jasper22's posterous