Иерархия контейнеров Prism, ServiceLocator и Unity и многооконное WPF-приложение - PullRequest
4 голосов
/ 02 апреля 2011

Я хочу создать приложение WPF / Prism, где каждое окно верхнего уровня находится в своем собственном потоке пользовательского интерфейса.Это довольно просто сделать.Я использую Unity в качестве моего DI-контейнера и хотел бы создать иерархию контейнеров.В простейшем случае корневой контейнер будет находиться на уровне приложения, а каждое окно будет иметь дочерний контейнер.Это желательно, поскольку каждое окно может иметь свои собственные общие объекты, ограниченные дочерним контейнером.

Я бы хотел, чтобы у каждого окна был свой собственный менеджер региона из Prism, чтобы у меня не возникало проблем с многопоточностью, поскольку каждыйОкно будет иметь свой собственный поток пользовательского интерфейса.Я вижу, что Region и RegionManager используют синглтон ServiceLocator.Current.Это проблема, потому что я хотел бы, чтобы RegionManager использовал контейнер, к которому он относится, что невозможно со статическим синглтоном.Кто-нибудь из вас сталкивался с этой проблемой и как бы вы обошли ее?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2012

Мне действительно нужно было сделать то же самое, и я нашел следующее решение:

Прежде чем перейти к «дочернему» региону, выполните следующие действия:

var childRegion = _childRegionManager.Regions["ChildRegion"];            
_childRegion.NavigationService = _childContainer.GetExportedValue<IRegionNavigationService>();
_childRegion.NavigationService.Region = _childRegion;

Устанавливает правильную службу навигации в дочернем регионе.

Конечно, childContainer должен иметь IRegionNavigationService в своем собственном каталоге, чтобы правильно его составить.

0 голосов
/ 08 мая 2011

Вы можете использовать Bootstrapper в качестве дочернего контейнера и регистрировать там свои типы.И ваш ServiceLocater на уровне приложения, который будет вызывать ваши Bootstrappers.

подробнее о;http://msdn.microsoft.com/en-us/library/ff649077.aspx

...