2013-01-31 71 views
3

我无法在.NET 4.5中找到System.ComponentModel.Composition.Initialization.dll(其中包含CompositionInitializer类的声明)。这个程序集是否已经从.NET 4.5中的MEF中移除? 现在我该如何编写标有[导出]和[导入]属性的应用程序的某些部分?MEF 4.5中缺少CompositionInitializer。我可以用什么来代替?

假设我有这样的观点:

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

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

及相应的视图模型:

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

我要补充在我的壳(或其他地方)组成,这些零件?

回答

5

CompositionInitializer和类似的类存在于Silverlight中,但不是完整的.NET Framework。 MEF小组有目的地决定将它们排除在外,因为他们认为它们不合适。

逻辑是应该使用施工注塑。

也就是说,Silverlight中使用该类的逻辑在WPF中应用完全相同。我有blogged about this in .NET 4,并且包含一个适用于完整框架的实现。

+0

你可以给MEF构造器注入的简单的例子? 我想在shell中使用适当的ViewModels组合我的所有视图。 –

+0

@DmitryMartovoi除非您在代码*中构建您的视图,否则很难做到。请参阅此处的构造函数部分:http://mef.codeplex.com/wikipage?title=Declaring%20Imports –

1

你失去了init组合,f.e.

_container = new CompositionContainer(catalog); 

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

msdn

+0

因此,我应该在所有视图中使用这样的代码吗?似乎很伤心... –

+0

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

相关问题