Silverlight Prism MEF:为什么要使用ServiceLocator获取View实例?

时间:2012-11-28 11:00:16

标签: silverlight prism mef service-locator

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

找到答案elsewhere on Stackoverflow

1 个答案:

答案 0 :(得分:1)

那是因为主App不应该知道模块。

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

ServiceLocator会向MEF询问依赖关系,因此您可以随时调用_serviceLocator.GetInstance<View1>()无参数,MEF将解决任何需要导入的问题,无论您在View1中更改了什么s构造函数签名。