在棱镜中使用带有统一扩展的子容器

时间:2011-08-10 08:59:36

标签: silverlight dependency-injection unity-container prism ioc-container

上下文

我正在寻找一种在Silverlight应用程序中使用PRISM和unity构建系统的方法,这样我就可以拥有一个用例控制器来管理导航以及与特定用例相关的其他内容。这个用例控制器应该有自己的统一容器,这样我就可以隔离该用例所需的依赖项。

代码

以下代码段用于初始化用例控制器并进行设置,以便使用正确的子容器。

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 个答案:

答案 0 :(得分:1)

这是因为Region正在尝试使用默认的ServiceLocator解析您的视图。当该区域尝试为您解析您的视图时,它会转到RegionNaviationService并使用它来尝试解析视图。默认的RegionNavigationService使用ServiceController来执行此操作。

如果您想解决此问题,可以通过将一个RegionNavigationService传递给该区域的NavigationService属性来为您的区域提供新的RegionNavigationService。您可以使用它来确保您的区域从您希望它使用的Unity容器中解析它的视图,而不是默认使用它的默认ServiceLocator。

希望这有帮助