Silverlight 使用带有unity扩展的prism中的子容器 上下文
我正在寻找一种在Silverlight应用程序中使用PRISM和unity构建系统的方法,这样我就可以拥有一个用例控制器来管理导航和其他与特定用例相关的东西。这个用例控制器应该有自己的unity容器,这样我就可以隔离该用例所需的依赖关系 代码 以下代码段用于初始化用例控制器,并将其设置为使用正确的子容器Silverlight 使用带有unity扩展的prism中的子容器 上下文,silverlight,dependency-injection,unity-container,prism,ioc-container,Silverlight,Dependency Injection,Unity Container,Prism,Ioc Container,我正在寻找一种在Silverlight应用程序中使用PRISM和unity构建系统的方法,这样我就可以拥有一个用例控制器来管理导航和其他与特定用例相关的东西。这个用例控制器应该有自己的unity容器,这样我就可以隔离该用例所需的依赖关系 代码 以下代码段用于初始化用例控制器,并将其设置为使用正确的子容器 public class MyController { private IUnityContainer _container; public MyController(IUni
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;
}
}
公共类MyController
{
专用IUnityContainer\u容器;
公共MyController(IUnityContainer容器)
{
_容器=容器;
_RegisterType(ModuleViews.MyChildView);
}
[依赖性]
公共IRegionManager区域管理器{get;set;}
公共StartUseCase()
{
//这将导致System.Object的解析操作,而不是我注册的视图
//在子容器中
this.RegionManager.RequestNavigate(ModuleRegions.ChildRegion,ModuleViews.MyChildView);
}
公共静态MyController创建(IUnityContainer容器)
{
var childContainer=container.CreateChildContainer();
RegisterInstance(childContainer);
//容器视图已在父容器中注册
var containerView=container.Resolve(GlobalViews.MyContainerView);
var childRegionManager=parentRegionManager.Regions[GlobalRegions.MainRegion].Add(containerView,GlobalViews.MyContainerView,true);
RegisterInstance(childRegionManager);
var controller=childContainer.Resolve();
返回控制器;
}
}
问题
基本功能正常,但当我尝试使用RegionManager.TryNavigate(…)
时,它无法解析具有指定名称的视图。我已经在子容器中用正确的名称注册了视图,但是很明显,我在用例控制器中得到的RegionManager只解析我在根容器中注册的视图
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;
}
}
我的问题
我需要做什么才能使子视图正确解析,而无需在父unity容器中注册它。这是因为该区域正在尝试使用默认ServiceLocator解析您的视图。当区域尝试为您解析视图时,它会转到区域导航服务,并使用此服务尝试解析视图。默认的RegionNavigationService使用ServiceController来执行此操作
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;
}
}
如果您想解决这个问题,可以通过将一个区域传递给该区域的NavigationService属性,为该区域提供一个新的RegionNavigationService。您可以使用它来确保您的区域从您希望它使用的Unity容器而不是默认使用的默认ServiceLocator解析它的视图
希望这有帮助