В этом весь смысл внедрения зависимости.Если бы контейнер не мог создать экземпляры объектов, которые сами имеют зависимости, его было бы не очень практично использовать.
Ответ заключается в том, что контейнер отражает ShellView
и находит конструктор с наибольшим количеством параметров (тривиальноздесь, так как есть только один на выбор).Затем для каждого параметра он ищет его тип ShellViewModel
и затем рекурсивно пытается выяснить, как создать экземпляр параметра.
Предполагая, что в какой-то момент «дерево» зависимостей заканчивается (он находит зависимости, которыене имеют параметров конструктора, например ShellViewModel
здесь), он начинает строить зависимости и, наконец, попадает в запрошенный вами объект.
В этом примере он видит, что может создать ShellViewModel
тривиально (и), затем вызывает конструктор ShellView
с этим объектом в качестве аргумента.