IoC и пользовательские интерфейсы
-
08-07-2019 - |
Вопрос
Я пытаюсь обдумать лучший способ использования IoC в своем приложении для внедрения зависимостей, однако у меня есть небольшая проблема.
Я использую свободную реализацию шаблона MVP с приложением WPF. По сути, создается класс презентатора, а представление и задача (например, IEmployeeView и IEmployeeTask для EmployeePresenter) внедряются в презентатора.
Я бы хотел использовать контейнер IoC (я пробую Unity, хотя, полагаю, это также может произойти и с другими, такими как ninject или Structure Map) вместо ручного внедрения этих экземпляров, однако, если презентатор создан (или разрешается из контейнера IoC) при асинхронном вызове делегата или в потоке событий (например, без STA-потоков), а затем при создании нового экземпляра окна WPF выдается следующее исключение:
Текущая операция сборки (ключ сборки Ключ сборки [ namespace .Window1, null]) Ошибка: вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требовать этого.
Теперь я знаю, что новые экземпляры окон и т. д. должны быть STA, однако возможно ли использовать контейнер IoC для внедрения зависимостей, даже если пользовательский интерфейс должен быть создан в потоке STA?
Из рассмотрения этой проблемы может показаться, что разрешаемый класс / тип создается во время разрешения, а не при его регистрации ...
Решение
Я бы сказал, использовать Factory для создания объектов Presenter; таким образом, вы можете создавать свои общие экземпляры Presenters внутри PresenterFactory в потоке STA, а затем просто передавать их при необходимости.
Другие советы
Ваша проблема не имеет ничего общего с IoC, доступ к объекту WPF возможен только из того же потока, в котором он был создан, поэтому вам нужно создать докладчик в том же потоке, что и остальная часть вашего графического интерфейса (а не только в STA). нить). р>
Используйте Dispatcher.BeginInvoke для запуска кода в главном потоке и вызова оттуда Ioc contianer.
Вы упоминаете Unity, рассматривали ли вы использование библиотеки составных приложений, в которой она также используется? Пример приложения StockTrader использует Unity для внедрения представлений в модели презентаций. Если вы не хотите использовать CAL - больше информации: ( http://msdn.microsoft.com/en-us/library/cc707890 .aspx или http://www.codeplex.com/CompositeWPF )
возможно, вы все равно сможете понять, как они обошли проблему.