Вы можете зарегистрировать все эти типы в контейнере, и метод OnStartup
может выполнить один вызов Resolve
.
Во-первых, пусть MainWindow
принимает свою модель представления в своем конструкторе:
public MainWindow(MainViewModel viewModel)
{
DataContext = viewModel;
}
Затем зарегистрируйте MainWindow
и MainViewModel
в контейнере рядом с сервисами. Если MainViewModel
требуются другие модели представления, поместите их в его конструктор и зарегистрируйте их.
Наконец, решите MainWindow
, который выполняет всю работу по созданию экземпляра:
var window = container.Resolve<MainWindow>();
window.Show();
Ключевым моментом здесь является то, что модель представления ничем не отличается от любого другого класса, который вы бы зарегистрировали в контейнере.
Преимущества этого подхода (из комментариев):
1) Контейнер выполняет все вызовы конструктора за вас - вам просто нужно описать каждый фрагмент графика, и он проходит через скучную процедуру его сборки.
2) MainViewModel
освобождается от необходимости знать, как создавать свои дочерние модели представления, что позволяет ему сосредоточиться на своих основных обязанностях вместо необходимости знать каждую отдельную зависимость своих детей.