如何使用MEF实现这个viewmodel工厂?

时间:2012-08-11 20:09:21

标签: c# mvvm export mef composition

我从PRISM示例中复制了一个名为MVVM RI的代码,在这个工厂中有一个Dictionary<Type, Func<Question, QuestionViewModel>>用于映射。这是:

    /// <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]不起作用的原因(我猜)。

1 个答案:

答案 0 :(得分:0)

您可以考虑使用ExportFactory<T>。这包含在Silverlight中,对于WPF,您可以从Glenn Block's Skydrive下载Silverlight代码的端口。

使用ExportFactory,您可以根据需要为给定的导入类型创建任意数量的对象。

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

然后,您可以调用CreateExport()的{​​{1}}方法来导出新对象。我最近了解了如何使用ExportFactory,因此this post可能会帮助您入门。