IoC и пользовательские интерфейсы - PullRequest
0 голосов
/ 20 ноября 2008

Я пытаюсь обернуть голову вокруг наилучшего способа использования IoC в своем приложении для внедрения зависимостей, однако у меня есть небольшая проблема.

Я использую свободную реализацию шаблона MVP с приложением WPF. По сути, создается класс презентатора, а представление и задача (например, IEmployeeView и IEmployeeTask для EmployeePresenter) внедряются в презентатор.

Я бы хотел использовать контейнер IoC (я пробую Unity, хотя я предполагаю, что это также произойдет и с другими, такими как ninject или Structure Map) вместо ручного внедрения этих экземпляров, однако, если презентатор создан (или разрешается из контейнера IoC) при асинхронном вызове делегата или в потоке событий (например, без STA-потоков), а затем при создании нового экземпляра окна WPF выдается следующее исключение:

Текущая операция сборки (ключ сборки Ключ сборки [ namespace .Window1, null]) Ошибка: вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требует этого.

Теперь я знаю, что новые экземпляры окон и т. Д. Должны быть STA, однако возможно ли использовать контейнер IoC для внедрения зависимостей, даже если пользовательский интерфейс должен быть создан в потоке STA?

Из рассмотрения этой проблемы может показаться, что разрешаемый класс / тип создается во время разрешения, а не при его регистрации ...

Ответы [ 3 ]

2 голосов
/ 20 ноября 2008

Ваша проблема не имеет ничего общего с IoC, доступ к объекту WPF возможен только из того же потока, который его создал - поэтому вам нужно создать докладчик в том же потоке, что и остальная часть вашего графического интерфейса (а не только STA). нить).

Используйте Dispatcher.BeginInvoke для запуска кода в основном потоке и вызова оттуда Ioc contianer.

2 голосов
/ 20 ноября 2008

Вы упомянули Unity, рассматривали ли вы использование библиотеки составных приложений, которая также использует ее? Пример приложения StockTrader использует Unity для внедрения представлений в модели презентаций. Если вы не хотите использовать CAL - больше информации: (http://msdn.microsoft.com/en-us/library/cc707890.aspx или http://www.codeplex.com/CompositeWPF)

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

2 голосов
/ 20 ноября 2008

Я бы сказал, использовать фабрику для создания объектов Presenter; таким образом, вы можете создавать свои общие экземпляры Presenters внутри PresenterFactory в потоке STA, а затем просто передавать их при необходимости.

...