2012-08-11 48 views
0

我已經從PRISM的例子中複製了一個名爲MVVM RI的代碼,在這個工廠內有一個用於映射的Dictionary<Type, Func<Question, QuestionViewModel>>。它是:如何使用MEF實現這個viewmodel工廠?

/// <summary> 
    /// Factory class to create a question view model for a given question object. 
    /// </summary> 
    private static class QuestionViewModelFactory 
    { 
     private static Dictionary<Type, Func<Question, QuestionViewModel>> maps = new Dictionary<Type, Func<Question, QuestionViewModel>>() 
     { 
      { typeof(OpenQuestion), (q) => new OpenQuestionViewModel((OpenQuestion)q) }, 
      { typeof(MultipleSelectionQuestion), (q) => new MultipleSelectionQuestionViewModel((MultipleSelectionQuestion)q) }, 
      { typeof(NumericQuestion), (q) => new NumericQuestionViewModel((NumericQuestion)q) } 
     }; 

     public static QuestionViewModel GetViewModelForQuestion(Question question) 
     { 
      Func<Question, QuestionViewModel> viewModelInstanceFactory = null; 
      if (maps.TryGetValue(question.GetType(), out viewModelInstanceFactory)) 
      { 
       return viewModelInstanceFactory(question); 
      } 
      else 
      { 
       throw new ArgumentOutOfRangeException("Could not locate a view model for question type"); 
      } 
     } 
    } 

請注意,派生的每個類QuestionViewModel需要創建一個構造函數參數。

public abstract class QuestionViewModel : NotificationObject 
{ 
    protected QuestionViewModel() { ... } 
} 

public abstract class QuestionViewModel<T> : QuestionViewModel 
    where T : Question 
{ 
    protected QuestionViewModel(T question) { ... } 
} 

但現在,我需要通過發現有這樣的工廠(因爲我沒有一個參考,這些都是在不同的模塊)。我想在開始時創建一個新的自定義屬性,但後來我說:我怎麼能將參數傳遞給構造函數?

我打算創建數百個相同數據類型的問題,這就是爲什麼[Import]不起作用(我猜)。

回答

0

你可以看看使用ExportFactory<T>。這包含在Silverlight中,對於WPF,您可以從Glenn Block's Skydrive下載Silverlight代碼的端口。

使用ExportFactory您可以根據需要爲給定的導入類型創建任意數量的對象。

[ImportMany] 
public IEnumerable<ExportFactory<IModule, IModuleMetadata>> Modules { get; set; } 

然後你就可以調用ExportFactoryCreateExport()方法導出一個新的對象。我最近了解到使用ExportFactory,所以this post可能會幫助您開始。