По словам Мартина Фаулера, эксперта в данной области, Dependency Injection - это еще одно название для конкретной реализации абстрактной концепции, известной как Inversion of Control ( полная статья ).
В корне все средства DI: объекты, от которых зависит класс, чтобы они работали правильно, инициализируются и передаются в него извне, а не сам класс, отвечающий за получение / инициализацию этих объектов. Специфика того, как это достигается, выходит за рамки паттерна.
IoC - это то же самое, но, как говорит Мартин Фаулер, говорить, что «инверсия контроля» - это очень тупой способ описания происходящего.
Лично я не думаю, что "инъекция зависимости" намного лучше, хотя. Я бы описал это как «правильное использование конструкторов».
Пример не IoC / не DI:
class Foo
{
void DoSomething()
{
DbConnection myConnection = new DbConnection(ConfigurationSettings...);
myConnection.ExecuteCommand();
}
}
То же самое, используя IoC / DI:
class Foo
{
private DbConnection myConnection;
public Foo(DbConnection conn)
{
myConnection = conn;
}
void DoSomething()
{
myConnection.ExecuteCommand();
}
}
Я с уважением не согласен с теми, кто утверждает, что это не настоящий IoC / DI, если у вас нет явного связывателя / ассемблера / что-у-вас, которое связывает внедренные типы с конкретными реализациями, потому что класс, получающий зависимости, не не знаю разницу. Упорядочиваете ли вы зависимости во внешнем классе или во внешнем конфигурационном файле - это деталь реализации.