2

在 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]

在 Stackoverflow 上的其他地方找到了答案

4

1 回答 1

1

那是因为主应用程序不应该知道模块。

当一个模块被加载时,它会注册到ServiceLocator并且它可以访问RegionManager.
然后,它可以在主应用程序不知道有关新加载模块的任何信息的情况下,将模块中的视图注入主应用程序(例如新选项卡)。

ServiceLocator将向 MEF 询问依赖关系,因此您始终可以无参数调用,_serviceLocator.GetInstance<View1>()MEF 将解析需要导入的任何内容,无论您在View1的构造函数签名中进行什么更改。

于 2012-11-28T11:06:00.830 回答