2013-01-31 98 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,是的,但你可以把它們放在一起 –

相關問題