Основной способ, которым он работает, заключается в том, что вы запрашиваете у контейнера IoC тип («resol»), и он будет использовать отражение для поиска конструктора (для Unity - тот, у которого больше аргументов, если они являются множественными конструкторами),Затем он будет повторять процесс для каждого из типов аргументов, как дерево, вплоть до графа зависимостей.Unity сможет автоматически создавать экземпляры конкретных типов, но если конструктор использует интерфейс или абстрактный тип, ему необходимо знать, какую реализацию использовать, поэтому в этих случаях вам необходимо заранее зарегистрировать тип:
Зарегистрировать:
например container.RegisterType<IUserHelper, UserHelper>();
Разрешение:
Например container.Resolve<IUserHelper>();
Контейнеры IOC не работают с MVC из коробки, но существуют дополнительные библиотекинапример, Unity.MVC5, который подключается к конвейеру MVC, поэтому, когда MVC пытается создать контроллер, он использует контейнер IoC вместо непосредственного обновления контроллера (что может привести к сбою, если он не содержит параметров).
Здесьпример:
public class MyController(IUserHelper userHelper, IRepository repository) : Controller
Тогда мы могли бы иметь:
public class MyRepository(IDbContext dbContext) : IRepository
и
public class MyDbContext () : IDbContext
Если мы используем RegisterType для регистрации IUserHelper, IRepository и IDbContext, то когдаMVC необходимо создать контроллер, он сможет собрать контроллер со всеми зависимостями.