Я думаю, вы неправильно поняли роль фреймворка IoC.
Чтобы ответить на ваш вопрос
но разве ссылка не подразумевает зависимость?
Да, но на другом уровне.IoC о зависимостях между классами.Вместо использования new Something()
в вашем классе вы предоставляете конструктор, который требует всех зависимых интерфейсов.Таким образом, класс не контролирует, какая реализация ему передана.Это инверсия контроля.Контейнер IoC - это просто средство, помогающее управлять зависимостями приятным способом.
Допустим, у вас есть интерфейс ICustomerNotificationService
с реализацией, подобной
public class MailNotificationService : INotificationService
{
IMailerService _mailer;
ICustomerRepository _customerRepo;
IOrderRepository _orderRepo;
public MailNotificationService(IMailerService mailer,
ICustomerRepository customerRepo,
IOrderRepository oderRepo)
{
// set fields...
}
public void Notify(int customerId, int productId)
{
// load customer and order, format mail and send.
}
}
Так что, если ваше приложение запрашиваетэкземпляр ICustomerNotificationServcie
контейнер выясняет, какие конкретные реализации взять и пытается удовлетворить все зависимости, которые имеет запрошенный класс.
Преимущество состоит в том, что вы можете легко настроить все зависимости в логике начальной загрузки и иметь возможность изменятьповедение вашего приложения очень легко.
Например, при тестировании вы запускаете приложение с реализацией IMailerService
, которая записывает почту в файл, а в рабочем режиме подключается настоящая почтовая служба.Это было бы невозможно, если бы вы обновились, скажем, MailerService
в своем конструкторе вместо того, чтобы принимать его в качестве параметра.
Хороший контейнер IoC может обрабатывать гораздо больше, для вас как управление временем жизни, одиночками, сканированием сборокдля типов вы хотите зарегистрироваться и многое другое.Мы основали всю нашу систему плагинов на Структурной карте , например.
Вы можете взглянуть на эту статью блога и вторую часть .