在Prism的IModule Initialize()方法中,调用RegisterViewWithRegion()方法来映射视图和区域。
这两行代码有什么区别?为什么要使用ServiceLocator?
_regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>());
_regionManager.RegisterViewWithRegion("Region1", typeof(View1));
以下是上下文的整个ModuleInit.cs类:
namespace MyModule
{
[ModuleExport("MyModule.ModuleInit", typeof(MyModule.ModuleInit))]
public class ModuleInit : IModule
{
private readonly IRegionManager _regionManager;
public IServiceLocator _serviceLocator;
[ImportingConstructor]
public ModuleInit(IRegionManager regionManager, IServiceLocator serviceLocator)
{
_regionManager = regionManager;
_serviceLocator = serviceLocator;
}
#region IModule Members
public void Initialize()
{
_regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>());
}
#endregion
}
}
[编辑]
RegisterViewWithRegion Method MSDN网站描述了两个不同版本的功能:
RegisterViewWithRegion(IRegionManager, String, Func<Object>)
使用委托解析a,将视图与区域相关联 concreate视图的实例。当区域显示时,这个 将调用delelgate,并将结果添加到视图中 收集该地区。
RegisterViewWithRegion(IRegionManager, String, Type)
通过注册类型将视图与区域相关联。当地区 get显示此类型将使用ServiceLocator解析 进入一个具体的例子。该实例将添加到视图中 该地区的集合
所以在我看来,唯一的区别是使用ServiceLocator将该类型立即解析为实例,或者稍后在显示该区域时将其解析为实例?
[EDIT2]
答案 0 :(得分:1)
那是因为主App不应该知道模块。
加载模块后,它会向ServiceLocator
注册,并且可以访问RegionManager
。
然后,在主应用程序不知道有关新加载模块的任何内容的情况下,可以将模块中的视图注入主应用程序(例如,新选项卡)。
ServiceLocator
会向MEF询问依赖关系,因此您可以随时调用_serviceLocator.GetInstance<View1>()
无参数,MEF将解决任何需要导入的问题,无论您在View1
中更改了什么s构造函数签名。