2015-10-02 82 views
1

我正在使用MEF(依賴注入,構造函數注入)導入一個Lazy<MyForm>對象,基本上有問題,當我顯示並關閉表單並且之後嘗試再次打開表單時,它將不再工作,導致對象已經處理完畢。每次我打開它時,我都想要一個全新的表單實例。懶惰<T> - 總是創建一個新的對象?

有沒有類似Lazy<T>的類,但總是給我一個新的對象?

編輯:

我不能給你我的代碼的那一刻,但我會有點細講:

哪裏有兩種形式:

Form1的是起點表單,其中有一個ImportingConstructor目前正在導入一個Lazy<Form2>對象。 我的Form2也有一個ImportingConstructor,它可以導入其他幾個類。 當我點擊Form1上的按鈕時,正在訪問m_lazyForm2.Value,並且Form2顯示出來。

MEF(和我的Form1)使用我自己構建的引導程序初始化。

internal class Bootstrapper<T> where T : Form 
{ 
    [Import] 
    private T m_frmStartup; 
    private CompositionContainer m_container; 

    public void Init() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     var batch = new CompositionBatch(); 
     batch.AddPart(catalog); 

     m_container = new CompositionContainer(catalog); 
     m_container.ComposeParts(this); 
    } 

    public void Start() 
    { 
     Application.Run(m_frmStartup); 
    } 
} 
+2

爲什麼你不能通過一個'Func '來每次都創造一個新的'T'? –

+0

我的T班有一個ImportingConstructor以及 – Jannik

+1

顯示代碼,您如何設置您的DI以及您如何使用它。 –

回答

0

好的,正如我在評論中已經說過的,我自己找到了解決方案。

的解決方案是:

  1. 更改我的Lazy<T>進口ExportFactory<T>進口
  2. 導出我所有的意見與[PartCreationPolicy(CreationPolicy.NonShared)]屬性

這樣,你叫m_myViewExportFactory.CreateExport().Value每次,它會給你是你的觀點的新例子。

1

你可能會尋找一個factory method,無論是傳遞給您的形式,直接委託,或包裹成一個潛在的匿名實現一些接口。

A Lazy<T>確實只是在最後的可能時間點,即確實需要時初始化一些T。爲此,它可以簡單地調用T類型的默認構造函數,或者以Func<T>代表的形式執行提供的工廠方法。

您可以將Func<T>傳遞給您的表單而不是Lazy<T>包裝。