Работа с дочерним контейнером в призме с единичными расширениями - PullRequest
0 голосов
/ 10 августа 2011

Контекст

Я ищу способ построения системы с использованием PRISM и Unity в приложении Silverlight, чтобы у меня был контроллер сценариев использования, который управляет навигацией и другими вещами, связанными с конкретным сценарием использования. Этот контроллер варианта использования должен иметь свой собственный контейнер для единства, чтобы я мог изолировать зависимости, необходимые для этого варианта использования.

код

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

public class MyController
{
    private IUnityContainer _container;

    public MyController(IUnityContainer container)
    {
        _container = container;

        _container.RegisterType<Object,ChildView>(ModuleViews.MyChildView);
    }

    [Dependency]
    public IRegionManager RegionManager { get; set; }

    public StartUseCase()
    {
        // This results in a resolve action for System.Object instead of the view I registered
        // in the child container
        this.RegionManager.RequestNavigate(ModuleRegions.ChildRegion,ModuleViews.MyChildView);
    }

    public static MyController Create(IUnityContainer container)
    {
        var childContainer = container.CreateChildContainer();
        childContainer.RegisterInstance<IUnityContainer>(childContainer);

        // The container view is registered in the parent container
        var containerView = container.Resolve<Object>(GlobalViews.MyContainerView);
        var childRegionManager = parentRegionManager.Regions[GlobalRegions.MainRegion].Add(containerView,GlobalViews.MyContainerView,true);

        childContainer.RegisterInstance<IRegionManager>(childRegionManager);

        var controller = childContainer.Resolve<MyController>();

        return controller;
    }
}

Задача

Основы работают, но когда я пытаюсь использовать RegionManager.TryNavigate(...), он не разрешает представление с указанным именем. Я зарегистрировал представление с правильным именем в дочернем контейнере, но очевидно, что RegionManager, который я получил в своем контроллере вариантов использования, каким-то образом разрешает только те представления, которые я зарегистрировал в корневом контейнере.

Мой вопрос

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

1 Ответ

1 голос
/ 11 августа 2011

Это потому, что Регион пытается разрешить ваши представления, используя ServiceLocator по умолчанию.Когда регион пытается разрешить ваши представления для вас, он переходит к RegionNaviationService и использует это, чтобы попытаться разрешить представление.RegionNavigationService по умолчанию использует ServiceController для этого.

Если вы хотите обойти это, вы можете дать вашему региону новый RegionNavigationService, передав его в свойство NavigationService региона.Вы можете использовать это, чтобы убедиться, что ваш регион разрешает свои представления из контейнера Unity, который вы хотите использовать, а не по умолчанию ServiceLocator, который он использует по умолчанию.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...