Рассмотрим следующий принцип явной зависимости и сделав Window2
зависимостью MainWindow
Например
public class MainWindow {
private readonly Func<Window2> window2;
public MainWindow(Func<Window2> window2) {
this.window2 = window2;
}
public void OpenNewWindow2() {
var window = window2(); // invoke factory delegate
window.Show();
}
}
Выше показано использование Func<T>
в качестве делегата фабрикикоторый будет действовать как оболочка для отложенного разрешения требуемой зависимости.Каждый раз, когда фабричный делегат вызывается, он разрешает новый экземпляр Window2
, инвертируя элемент управления MainWindow
, который должен инициализировать его вручную;
App.Application_Startup
используется как корень композиции, где вы бызарегистрируйте каждую вещь в контейнере и разрешите MainWindow
, ваш корневой объект
public partial class App : Application {
DryIoc.Container container;
private void Application_Startup(object sender, StartupEventArgs e) {
container = RegisterIoc();
var mainwindow = container.Resolve<MainWindow>();
mainwindow.Show();
}
private DryIoc.Container RegisterIoc() {
var container = new DryIoc.Container();
container.Register<MainWindow>();
container.Register<Window2>();
container.Register<IManager1, Manager1>(Reuse.Singleton);
container.Register<IManager2, Manager2>(Reuse.Singleton);
container.Register<IManager3, Manager3>(Reuse.Singleton);
return container;
}
}
Обратите внимание, что для разрешения окон необходимо также убедиться, что они также зарегистрированы в контейнере.