Тема 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
Давайте создадим простенький пример: // сервис. содержит бизнес-логику
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