2010-11-14 116 views
1

我有一些簡單的導出/導入場景,我不能找出爲什麼這不起作用。在我的情況,我有一個WPF應用程序,如低於2 ClassLibrary,在Classlib1我有一個接口命名ITestEx1:如下MEF導入錯誤

public interface ITestEx1 
{ 
    string Name {get; set;} 
} 

和1派生類的命名(在testEx1):

using System.ComponentModel.Composition; 

[Export(typeof(ITestEx1))] 
public class TestEx1 : ITestEx 
{ 
    public Name {get; set;} 
} 

你可以看到這個類導出爲類型ITestEx1的,現在在Classlib2我refrenced Classlib1和具有如下一類:

using System.ComponentModel.Composition; 
using Classlib1; 

public class TestMEF 
{ 
[Import(typeof(ITestEx1))] 
public ITestEx1 TestE {get; set;} 
} 

和在主WPF應用程序我refrenced既Classlib1和ClassL IB2和MainWindow.xaml的構造我寫了這個代碼初始化MEF:

private CompositionContainer _container; 

... 

public MainWindow() 
{ 
    InitializeComponent(); 
    var catalog = new AggregateCatalog(); 
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(MainWindow).Assembly)); 
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestEx1).Assemble)); 
    _container = new CompositionContainer(catalog) 
    _container.ComposeParts(this); 
} 

...在按鈕點擊我有這樣的:

{ 
    ... 
    var aa = new TestMEF(); 
    aa.TestE.Name = "abc"; // Error, object null refrence 
} 

請幫我解決這個問題

回答

0

你必須從容器中取出實例,而不是自己創建實例。在這種情況下,您需要一個工廠(在容器中)即時創建對象。

1

如果您自己創建TestMEF(),則不會滿足導入。你必須從容器請求它:

var aa = _container.GetExport<ITestEx>(); 

或者,你可以在下面的屬性添加到主窗口類,它會得到填充,當你叫_container.ComposeParts(本)或_container.SatisfyImportsOnce(本) :

[Import] 
public ITestEx AA { get; set; }