MEF 4.5中缺少CompositionInitializer。我应该使用什么代替它?

3

在.NET 4.5中我找不到System.ComponentModel.Composition.Initialization.dll(其中包含CompositionInitializer类的声明)。这个程序集已经从.NET 4.5中的MEF中删除了吗?如何现在组合标有[Export]和[Import]属性的应用程序部分?

假设我有这个视图:

    internal partial class StartWindow : Window
    {
        public StartWindow()
        {
            InitializeComponent();
            DataContext = ViewModel;
        }

        [Import]
        public IStartWindowViewModel ViewModel { get; set; }
    }

以及相应的ViewModel:

    [Export]
    internal class StartWindowViewModel : IStartWindowViewModel
    {
        public IEnumerable<Customer> Customers { get; set; }
    }

我应该在我的shell(或其他地方)添加什么来组合这些部分?
2个回答

5

CompositionInitializer 和类似的类存在于Silverlight中,但不在完整的.NET Framework中。MEF团队有意决定将它们留出,因为他们认为这些类不合适。

其逻辑是应使用构造注入。

话虽如此,在Silverlight中使用该类所适用的逻辑恰好也适用于WPF。我已经在.NET 4中撰写了博客文章,并提供了一个适用于完整框架的实现。


你能给一个MEF构造函数注入的简单例子吗? 我想在shell中组合所有适当的ViewModels以一次性地创建所有的Views。 - Dzmitry Martavoi
@DmitryMartovoi,除非您在代码中构建视图,否则这很难实现。请参阅此处的构造函数部分:http://mef.codeplex.com/wikipage?title=Declaring%20Imports - Reed Copsey

1

你失去了初始组合,例如。

    _container = new CompositionContainer(catalog);

    //Fill the imports of this object
    try
    {
        this._container.ComposeParts(this);
    }
    catch (CompositionException compositionException)
    {
        Console.WriteLine(compositionException.ToString());
    }

{{链接1:msdn}}


@DmitryMartovoi,是的,但你可以把它们放在一起。 - burning_LEGION

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接