2010-11-14 7 views
1

J'ai un simple scénario d'exportation/importation que je ne peux pas comprendre pourquoi cela ne fonctionne pas. dans mon scénario, j'ai une application WPF et 2 ClassLibrary, en Classlib1 j'ai une interface nommée ITestEx1 comme ci-dessous:MEF Importer l'erreur

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

et 1 classe dérivée nommé (TestEx1) comme ci-dessous:

using System.ComponentModel.Composition; 

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

que vous peut voir cette classe exportée en tant que type de ITestEx1, maintenant Classlib2 i refrenced Classlib1 et ont une classe comme ci-dessous:

using System.ComponentModel.Composition; 
using Classlib1; 

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

et dans la principale application WPF i refrenced à la fois Classlib1 et ClassL IB2 et constructeur de MainWindow.xaml je l'ai écrit ce code d'initialisation 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); 
} 

... et cliquez sur le bouton i ai ceci:

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

S'il vous plaît aidez-moi à résoudre ce problème

Répondre

0

Vous devez extraire l'instance du conteneur, pas la créer vous-même. Dans ce cas, vous aurez besoin d'une fabrique (dans le conteneur) pour créer les objets à la volée.

1

Si vous créez TestMEF() vous-même, les importations ne seront pas satisfaites. Vous devez en faire la demande à partir du conteneur:

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

Sinon, vous pouvez ajouter la propriété suivante à la classe MainWindow, et il obtiendriez Spécifié quand vous avez appelé _container.ComposeParts (ce) ou _container.SatisfyImportsOnce (ce) :

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