我已經從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]
不起作用(我猜)。