2015-09-13 99 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); 
    } 
}