IoC означает инверсию управления.
Давайте посмотрим некоторый «сильно связанный код» («MyComponent» зависит от «Logger»):
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
var logger = new Logger();
:
}
}
Мы можем изменить его на использование «интерфейса», но кто-то должен предоставить «реализацию»:
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
ILogger logger = ...; // who’s going to provide this?
:
}
}
Внедрение зависимостей (DI) - это конкретная реализация IoC.
//Dependency Injection pattern
public class MyComponent
{
private ILogger _logger;
public MyComponent(ILogger logger)
{
_logger = logger;
}
public void DoSomeWork()
{
// Use the logger component here
_logger.Log();
:
}
}
Другая реализация - это Service Locator.
//Service Locator pattern
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
ILogger logger = ServiceLocator.GetService();
:
}
}
Мартин Фаулер заявляет: «При использовании локатора служб класс приложения явно запрашивает это посредством сообщения локатору. При внедрении нет явного запроса, сервис появляется в классе приложения - отсюда и инверсия управления ».
Также: «Выбор между Service Locator и Dependency Injection менее важен, чем принцип отделения конфигурации сервиса от использования сервисов в приложении. «
Вы можете проверить это сообщение: Инверсия зависимости: поиск службы или Инъекция зависимости
Также:
ASP.NET MVC: разрешить или внедрить? Это проблема ... Дино Эспозито
Инверсия управляющих контейнеров и шаблон внедрения зависимостей . Автор Martin Fowler
InversionOfControl , автор Martin Fowler