ASP.NET-MVC-5 Внедрение зависимостей - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в внедрении зависимостей mvc 5, я знаю, что у mvc 5 есть конструктор по умолчанию без параметров. Но при внедрении зависимостей мы создаем конструктор с параметром, а контейнеры IOC предоставляют объект для параметра. Мой вопрос в том, какКонтейнеры IOC, такие как Unity, заставляют mvc 5 понимать параметризованный конструктор

1 Ответ

0 голосов
/ 08 февраля 2019

Основной способ, которым он работает, заключается в том, что вы запрашиваете у контейнера 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 необходимо создать контроллер, он сможет собрать контроллер со всеми зависимостями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...