2015-09-13 69 views
0

TL; DR是否有强制的方法MEF Prism容器在通过View Disovery实例化之前实例化类?即之前regionManager.RegisterViewWithRegionC#Prism:在视图实例化之前实例化模型

我有一个业务流程,用户登录,然后我开始一些数据库读取。 LoginEvent已注册到EventAggregator,以便应用程序的其他部分可以听到它。问题是我的模型MyModel仅在注册依赖视图被注册后才会实例化,当然之后登录事件已经过去了。我可以这样做MyModel的构造函数,但感觉马虎。

当前进程

1. User logs in 
2. LoginEvent is dispatched 
2. View switches to MyView 
3. MyModel is instantiated and listens for LoginEvent that will never be dispatched 

期望处理

1. MyModel is instantiated and listens for LoginEvent 
2. User Logs in 
3. LoginEvent is dispatched 
4. MyModel hears LoginEvent and kicks of data read. 

任何帮助是极大的赞赏。

+0

如果您使用Prism模块概念,那么您可以提前激活/实例化您的视图,然后注册该区域。 – loopedcode

回答

1

提前实例化您的视图,以便它可用于侦听事件。您可以使用棱镜文档中所述的Module concepts在您的模块Initialize事件中实例化您的视图。这将有以下顺序:

  1. 应用程序启动
  2. 模块启动
  3. 查看实例&注册
  4. 用户登录
  5. 为LoginEvent截获
  6. 视图切换

下面的例子给你一些提纲(尚未经过测试,但应在结构上有效):

public class ModuleInit : IModule 
{ 
    ..... 
    CompositionContainer container; 
    IRegionManager regionManager; 

    [ImportingConstructor] 
    public ModuleInit(CompositionContainer container, IRegionManager regionManager) 
    { 
     this.container = container; 
     this.regionManager = regionManager; 
    } 

    public void Initialize() 
    { 
    var myView = this.container.GetExportedValue<MyView>(); 
    regionManager.RegisterViewWithRegion("myregion",() => myView); 
    } 
}