Вопрос

Я пытаюсь обдумать лучший способ использования 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 )

возможно, вы все равно сможете понять, как они обошли проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top