在 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>)
将视图与区域相关联,使用委托来解析视图的创建实例。当显示区域获取时,将调用此委托并将结果添加到区域的视图集合中。
RegisterViewWithRegion(IRegionManager, String, Type)
通过注册类型,将视图与区域相关联。当显示区域时,此类型将使用 ServiceLocator 解析为具体实例。该实例将被添加到该区域的 Views 集合中
所以在我看来,唯一的区别是使用 ServiceLocator 立即将类型解析为实例,或者稍后在显示区域时?
[编辑2]