2008-11-20 3 views
0

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

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

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

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

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

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

ответ

2

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

2

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

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

+0

Это наиболее вероятная причина, контейнеры IoC отлично работают в WPF. – Jab 2008-11-26 18:40:24

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^