Silverlight Prism MEF:为什么使用ServiceLocator获取视图实例?

Silverlight Prism MEF:为什么使用ServiceLocator获取视图实例?,silverlight,prism,mef,service-locator,Silverlight,Prism,Mef,Service Locator,在Prism的IModule Initialize()方法中,调用RegisterViewWithRegion()方法来映射视图和区域 这两行代码之间有什么区别?为什么要使用ServiceLocator _regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>()); _regionManager.RegisterViewWithRegion("Regio

在Prism的IModule Initialize()方法中,调用RegisterViewWithRegion()方法来映射视图和区域

这两行代码之间有什么区别?为什么要使用ServiceLocator

_regionManager.RegisterViewWithRegion("Region1", () => _serviceLocator.GetInstance<View1>());

_regionManager.RegisterViewWithRegion("Region1", typeof(View1));
通过注册类型将视图与区域关联。当该地区 显示的get将使用ServiceLocator解析此类型 变成具体的例子。实例将添加到视图中 该区域的收集

因此,在我看来,唯一的区别是使用ServiceLocator立即或稍后在显示区域时将类型解析为实例

[编辑二]


找到了答案,这是因为主应用程序不应该知道模块

加载模块时,它会向
服务定位器注册,并且可以访问
区域管理器

然后,它可以在主应用程序不知道新加载的模块的情况下,将模块中的视图注入主应用程序(例如,一个新选项卡)


ServiceLocator
将询问MEF依赖项,因此您可以始终调用
\u ServiceLocator.GetInstance()
无参数,MEF将解决任何需要导入的问题,无论您在
View1
的构造函数签名中做了什么更改。

我不确定是否理解您的答案。View1是模块的一部分,所以当我使用“typeof(View1)”代替ServiceLocator时,为什么它会对主应用程序产生影响?@Nuitari我添加了一段关于它的内容。好的,但是当我调用RegisterViewWithRegion并将类型作为第二个参数时,我不需要View1的类型吗?为什么构造器在这里起作用,我没有调用构造器?在view1的构造器中放置一个断点,它应该被调用。MEF就像一个复杂的工厂。请参见编辑,似乎两个版本的操作相同,但在不同的时间解析视图实例?
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(IRegionManager, String, Func<Object>) 
RegisterViewWithRegion(IRegionManager, String, Type)