2012-11-12 110 views
0

我碰到了牆壁。我添加了具有Service類的另一個程序集的引用。 因此,而不是創建一個新的實例我雖然這MEF將有助於(但不會)的。我做一些類似HelloScreens sample.The以下視圖模型的東西接受的屬性也保存模型。(職員)MEF caliburn micro

public class StaffFormViewModel : Screen 
{ 
    [Import] 
    public StaffService staffService { get; set; } 

顯然,這不起作用,因爲班級不是由MEF構建的。但是,即使我想與MEF我應該創建多個實例來構建它,所以我應該選擇非共享。但人們說,它的緩慢。 Caliburn微示例添加了類似的東西,以創建新的實例。這需要每行5行代碼。

batch.AddExportedValue<Func<PreferencesCategoriesFormViewModel>>(
    () => container.GetExportedValue<PreferencesCategoriesFormViewModel>()); 

的問題是,雖然如果我想以提供構造模型類我不能,因爲它是由MEF建立我可以用這個呢。我應該親自設置財產。 我只想要注入所需的服務。這不可能與mef?我應該公開靜態的容器,所以我可以參考它,並呼籲撰寫?請幫助:)

回答

2

你給了剛剛創造一個工廠,返回PreferencesCategoriesViewModel新實例樣本。他們正在使用內置委託類型Func爲了保存它們創建一個新的工廠接口,以及需要引用容器的接口的實現。

所以,如果你想通過MEF實例化視圖模型,然後您可以:

  1. 如果你只需要視圖模型的一個實例,那麼你可以通過構造器注入到父視圖注入它模型,並留下MEF初始化它
  2. 如果你需要控制視圖模型的實例,或者您需要實例化視圖模型的多個實例,那麼你可以注入一個視圖模型工廠類型父視圖模型

如果你要使用視圖模型工廠,那麼你可以:

  1. 使用內置的Func委託類型如上圖所示,你可以隨時使用其他Func類型需要一個或多個輸入參數作爲一個子視圖模型需要的數據
  2. 創建一個特定的工廠接口和具體實施,並註冊與容器
  3. 創建一個通用視圖樣板工廠,並注入該

選項3的例子,見http://pglazkov.blogspot.co.uk/2011/04/mvvm-with-mef-viewmodelfactory.html

你會注意到他的視圖模型工廠有一個對MEF容器的引用,他實際上通過MEF解決了這個問題。因此您的容器需要自行註冊。

+0

謝謝,但我想注入一個服務類,而不是由mef構造的類 – GorillaApe

+0

同樣的原則適用,它只是你的視圖模型構造函數將會改變,或者你的工廠方法來獲取它需要的數據。例如。你可以使用Func 或者創建一個接口類型和一個接受你的數據類型的方法。我鏈接到的視圖模型工廠也支持參數。 – devdigital

+0

3看起來不錯,因爲cm解決方案對我來說很難看。所以工廠似乎是2或3的解決方案。 – GorillaApe