2010-10-17 4 views
5

Ich habe gerade angefangen, MEF zu verwenden und habe ein frühes Problem gefunden.MEF 'Der Export ist nicht dem Typ zuweisbar' Fehler

Ich habe eine Schnittstelle namens Data:

namespace DataAccess 
{ 
    interface IDataService 
    { 
    string Name { get; } 
    string Description { get;} 

    List<String> GetPeople(); 
    } 
} 

Es gibt zwei Implementierungen dieser Schnittstelle, eine für SQL Server und eine für Oracle. Unten ist die Oracle-Implementierung, SQL Server-Implementierung ist genau das gleiche.

Die Namen und Beschreibung Eigenschaften sind jetzt nicht mehr vorhanden, da ich diese durch Metadaten ersetzt habe. Wie Sie sehen können, handelt es sich um sehr einfache Objekte. Ich wollte sicherstellen, dass ich diese Arbeiten ausführen kann, bevor ich mit der harten Arbeit anfange.

Dies ist der Code, den ich die Baugruppen entdecken bin mit:

private static CompositionContainer _container; 
    private const string ASSEMBLY_PATTERN = "*.dll"; 
    private AggregateCatalog _catalog; 

    [ImportMany] 
    IEnumerable<DataAccess.IDataService> services { get; set; } 

    private void button3_Click(object sender, EventArgs e) 
    { 


     _catalog = new AggregateCatalog(
      new DirectoryCatalog(txtLibPath.Text, ASSEMBLY_PATTERN), 
      new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     _container = new CompositionContainer(_catalog); 
     _container.ComposeParts(this); 
     MessageBox.Show(services.Count().ToString()); 
    } 

Dies ist der Fehler, der erzeugt wird:

Die Zusammensetzung erzeugt eine einzige Zusammensetzung Fehler. Die Ursache ist unten angegeben. Überprüfen Sie die CompositionException.Errors-Eigenschaft für weitere Informationen.

1) Der Export 'DataAccess.Oracle (ContractName = "DataAccess.IDataService")' ist nicht dem Typ 'DataAccess.IDataService' zuweisbar.

Resultierend in: Kann 'MEFTest.Form1.services (ContractName = "DataAccess.IDataService") auf Teil' MEFTest.Form1 'nicht festlegen. Element: MEFTest.Form1.services (ContractName = "DataAccess.IDataService") -> MEFTest.Form1

Es scheint keinen Sinn zu machen, dass es der Schnittstelle nicht zuweisen kann, für die es entwickelt wurde !

Sobald dieses Problem gelöst ist, ist meine nächste Frage, wie man holen und eine Instanz davon bekommen ...

Antwort

6

Es ist wie zwei verschiedene Versionen Ihres Vertrages Montage sieht (die mit DataAccess.IDataService) sind geladen werden. Einer stammt wahrscheinlich von Ihrem ausführbaren Pfad und der andere von Ihrem Plugin-Pfad. Ich berühre dieses Problem ein wenig in meinem Blogpost auf How to Debug and Diagnose MEF Failures, und die MSDN-Seite auf Best Practices for Assembly Loading geht ins Detail.

+0

Sie hatten Recht Daniel, ich hatte IDataService für die Projekte neu kompiliert, die die SQLServer- und Oracle-Plugins enthielten, referenzierte aber eine ältere Version in der Haupt-App. Ich habe den IDataService in ein separates Klassenbibliotheksprojekt verschoben und das von allen drei Projekten referenziert und alles funktioniert perfekt. Danke vielmals. – hermiod

+0

Das ist ziemlich mühsames Problem. Es genügt nicht, nur Ihr exe-Projekt zu überprüfen, sondern auch die Projekte aller Satelliten-Baugruppen, die es lädt. In meinem Fall geladene Projekte von mehr als 50 anderen Satelliten-Baugruppen und ich hatte eine harte Zeit, Tracking, die diese doppelte Belastung verursacht. Wenn nicht ein brillanter Hinweis von Daniel, ich weiß nicht, wie viel Zeit ich damit verbringen könnte, es zu lösen. –

0

Für mich hatte dies eine sehr einfache Lösung.

Hier ist a link! Das erklärt die Ursache.

In meinem Fall habe ich meine Assembly-Version gesperrt, aber meine Dateiversion reist. Meine nugget-Paket-ID stimmt mit der Version meiner Assembly-Datei überein.

Endergebnis ist, dass ich kontinuierlich erstellen kann, neue Nugets erstellen und dieses MEF-Interface-Problem nicht haben.

0

Ich muss sagen, dass ich einen solchen Fehler in völlig idiotischen Kontext hatte. Versehentlich, habe ich mir eine Export-Richtlinie und nicht auf Klasse setzen, sondern auf einer Funktion innerhalb der Klasse:

interface MyInterface 
{ 
    void MyFunction(); 
} 

public class MyClass : MyInterface 
{ 
    [Export(typeof(MyInterface))] 
    void MyFunction() { } 
} 

Überraschenderweise der Code ohne Warnungen sehr fein zusammengestellt. Aber dann habe ich Stunden damit verbracht, herauszufinden, warum MEF bei meinem dummen Druck fehlschlägt!

Verwandte Themen