(из файла StockTraderRIBootstrapper.cs в примере приложения Prism V2 StockTrader)
В чем разница между этим:
ShellPresenter presenter = new ShellPresenter();
и это:
ShellPresenter presenter = Container.Resolve<ShellPresenter>();
- Я понимаю, что второй пример касается обработки контейнера, как factory, идя к нему, говоря: "Мне нужен экземпляр объекта типа ShellPresenter".
- Но что, если, например, Мне нужно отправить параметры, что будет эквивалентно "новому ShellPresenter (1, true)" и т.д.?
- И поскольку контейнеру нужно сообщить о ShellPresenter, я ожидал найти где-нибудь в проекте место, где класс ShellPresenter регистрируется в контейнере, например. Я ожидал
что-то вроде этого:
Container.RegisterType<IShellPresenter, ShellPresenter>();
но не нашел его нигде. Итак, как контейнер узнает об этих типах, чтобы он мог. Разверните их? Я перестроил это в своем собственном проекте и получил ошибку "Разрешение ошибки с ошибкой" , где мне нужно зарегистрировать эту зависимость затем?
Любое направление/обсуждение здесь было бы полезно.
Необъяснимый ответ:
Итак, в bootstrapper, когда я регистрирую сам 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>();
Тогда он работает. Это так же удивительно, как и образовательное. Нужно утонуть. Я собираюсь попить кофе и подумать об этом некоторое время.
Если кто-то может понять, почему это так, это было бы очень полезно.