Я читал книгу Марка Симана по вложению зависимостей в .NET, и я изо всех сил пытаюсь настроить состав root в приложении WPF.
Мой контейнер будет зарегистрирован в методе запуска приложения:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var container = new Container();
container.Configure(r =>
{
r.For<IAccountServices>().Use<AccountServicesProxy>();
r.For<MainWindow>().Use<MainWindow>();
});
}
Это имеет смысл, поскольку запуск приложения представляет собой мой корневой состав.
Окна WPF в моем приложении основаны на моделях просмотра. В моделях модели используются инъекции конструктора. Например. Я могу составить модель представления, введя реализацию IAccountServices
.
Когда дело доходит до создания моего главного окна, я могу сделать следующее внутри метода OnStartup:
var mainWindow = container.GetInstance<MainWindow>();
mainWindow.Show();
Как только я окажусь внутри главного окна, я могу открыть другое окно. До сих пор я смог придумать один из способов сделать это: создать окно factory и спросить окно factory для разрешения экземпляра окна. Я должен убедиться, что окно factory доступно в каждой модели представлений, которая может потребоваться для открытия нового окна. На мой взгляд, это так же плохо, как перенос контейнера IoC вокруг моего приложения (на ум приходит анти-шаблон службы поиска).
Этот подход кажется вам правильным? Чувство моего чувства говорит мне, что это неправильно, но я не придумал лучшего способа достичь этого (пока).