Silverlight Prism MEF:为什么使用ServiceLocator获取视图实例?
在Prism的IModule Initialize()方法中,调用RegisterViewWithRegion()方法来映射视图和区域 这两行代码之间有什么区别?为什么要使用ServiceLocatorSilverlight 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
_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)