0

語境

我正在尋找一種方式來建立一個Silverlight應用程序中使用PRISM和統一的系統,這樣我可以有一個管理的導航等的使用情況控制器與特定用例相關的東西。這個用例控制器應該有它自己的統一容器,以便我可以隔離該用例所需的依賴關係。與子容器中的棱鏡工作與團結的擴展

下面的代碼片斷用於初始化用例的控制器和設置它的代碼

所以它使用正確的子容器。

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

這是因爲Region試圖使用默認的ServiceLocator來解析您的視圖。當該區域嘗試爲您解析視圖時,它會轉到RegionNaviationService並使用它來嘗試解析該視圖。默認的RegionNavigationService使用ServiceController來執行此操作。

如果你想解決這個問題,你可以通過向Region的NavigationService屬性傳遞一個新的RegionNavigationService。您可以使用它來確保您的區域從您希望使用的Unity容器中解析出它的視圖,而不是默認使用的默認ServiceLocator。

希望這會有所幫助