(из файла StockTraderRIBootstrapper.cs в примере приложения Prism V2 StockTrader)
Какая разница между:
ShellPresenter presenter = new ShellPresenter();
и это:
ShellPresenter presenter = Container.Resolve<ShellPresenter>();
- Я понимаю, что во втором примере контейнер обрабатывается как фабрика, подойдя к нему со словами: "Мне нужен экземпляр объекта типа ShellPresenter".
- Но что, если, например, Мне нужно отправить параметры, что будет эквивалентно «новый ShellPresenter (1, true)» и т. Д .?
- И поскольку контейнеру нужно рассказать о ShellPresenter, я ожидал найти где-нибудь в проекте место, где класс ShellPresenter будет зарегистрирован в контейнере, например, Я ожидал
как то так:
Container.RegisterType<IShellPresenter, ShellPresenter>();
но нигде не нашел. Так как же контейнер узнает об этих типах, чтобы он мог их разрешить? Я перестроил это в своем собственном проекте и получаю ошибку «Разрешение сбоя зависимости» , где мне тогда регистрировать эту зависимость?
Любое направление / обсуждение здесь будет полезно.
Необъяснимый ответ:
Итак, в загрузчике, когда я регистрирую сам Shell:
protected override void ConfigureContainer()
{
Container.RegisterType<IShellView, Shell>();
base.ConfigureContainer();
}
тогда Контейнер может разрешить тип ShellPresenter. Так как же регистрируется тип ShellPresenter при регистрации типа Shell ?
Удивительный ответ:
Хорошо, получается, что вам не нужно регистрировать тип, который вы пытаетесь разрешить, но вам нужно регистрировать типы параметров (интерфейса), передаваемые в конструктор типа, который вы пытаетесь разрешить , т. е. поскольку я внедряю интерфейс IShellView в конструктор моего ShellPresenter, мне нужно было зарегистрировать тип IShellView, а не тип IShellPresenter:
public ShellPresenter(IShellView view) ...
Я проверил это, пытаясь определить тип Tester :
Tester tester = Container.Resolve<Tester>();
Пока я добавляю SomeClass в его конструктор:
public Tester(ISomeClass someClass)
Я получаю неразрешенные ошибки зависимости, пока не регистрируюсь SomeClass в контейнере:
Container.RegisterType<ISomeClass, SomeClass>();
Тогда это работает. Это так же удивительно, как и образовательно. Нужно погрузиться. Я собираюсь пойти выпить кофе и немного подумать об этом.
Если кто-нибудь может уточнить, почему это так, это было бы очень признательно.