2010-12-06 6 views
5

ich eine Frage zu folgenden Ausnahme habe ich einen Anruf zu .ComposeParts(this) abzuschließen empfing versuchen:Sie versuchen, herauszufinden, was die MEF Zusammensetzung Fehler bedeuten

Die Zusammensetzung kann einen einzelnen Zusammensetzung Fehler erzeugt. Die Ursache ist unten angegeben. Weitere Informationen finden Sie in der CompositionException.Errors-Eigenschaft .

1) Der Export 'CustomersModule.CustomerMenu (ContractName = "ModLibrary.IMenu")' ist nicht zuweisbar Typ ‚System.Collections.Generic.IEnumerable`1 [[ModLibrary.IMenu, ModLibrary, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null]] '.

in Resultierende: Kann nicht importieren gesetzt 'ModAppWorks.Host.Menus (ContractName = "ModLibrary.IMenu")' auf Teil 'ModAppWorks.Host'. Element: ModAppWorks.Host.Menus (ContractName = "ModLibrary.IMenu") -> ModAppWorks.Host

Es gibt einen Teil, der es scheint, als ob der Fehler bedeutet, dass IMenuIEnumerable implementieren müssen. Hier ist meine Zusammensetzung Code:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Host host = new Host(); 
     host.Run(); 
    } 
} 

class Host 
{ 
    #region Init 
    public Host() 
    { } 
    #endregion 

    #region Functions 
    public void Run() 
    { 
     Compose(); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new AppHost()); 
    } 

    private void Compose() 
    { 
     var agrCatalog = new AggregateCatalog(); 
     var dirCatalog = new DirectoryCatalog(Path.GetDirectoryName 
      (Assembly.GetExecutingAssembly().Location) + "..\\..\\..\\Extensions", "*.dll"); 
     var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

     agrCatalog.Catalogs.Add(dirCatalog); 
     agrCatalog.Catalogs.Add(asmCatalog); 

     var hostContainer = new CompositionContainer(agrCatalog); 
     hostContainer.ComposeParts(this); 
    } 
    #endregion 

    #region Properties 
    [Import(typeof(IMenu))] 
    public IEnumerable<IMenu> Menus { get; set; } 
    #endregion 

Ich bin den Import einer Klasse, die Instanzen ein ToolStripMenuItem. Meine Export Beispiel:

[Export(typeof(IMenu))] 
public class CustomerMenu : IMenu 
{ 
    #region Fields 
    private System.Windows.Forms.ToolStripMenuItem CustomerMainMenu; 
    private System.Windows.Forms.ToolStripSeparator mnuSeparator; 
    private System.Windows.Forms.ToolStripMenuItem CustomersMenuItem; 
    #endregion 

    #region Init 
    public CustomerMenu() 
    { 
     InitializeComponent(); 
     // 
     // CustomerMenu 
     // 
     this.CustomerMainMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 
     this.mnuSeparator, 
     this.CustomersMenuItem}); 
     this.CustomerMainMenu.Name = "CustomerMenu"; 
     this.CustomerMainMenu.Size = new System.Drawing.Size(94, 20); 
     this.CustomerMainMenu.Text = "Customer Menu"; 
     // 
     // toolStripMenuItem1 
     // 
     this.mnuSeparator.Name = "toolStripMenuItem1"; 
     this.mnuSeparator.Size = new System.Drawing.Size(149, 6); 
     // 
     // Customers 
     // 
     this.CustomersMenuItem.Name = "Customers"; 
     this.CustomersMenuItem.Size = new System.Drawing.Size(152, 22); 
     this.CustomersMenuItem.Text = "Customers"; 
    } 

    #endregion 

    #region Functions 
    private void InitializeComponent() 
    { 
     this.CustomerMainMenu = new System.Windows.Forms.ToolStripMenuItem(); 
     this.mnuSeparator = new System.Windows.Forms.ToolStripSeparator(); 
     this.CustomersMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 
    } 

    #endregion 

Wenn IMenu ist nicht erforderlich IEnumerable zu implementieren, jemand etwas tut, sehe ich vielleicht falsch machen werden?

Antwort

6

Wenn Sie eine Auflistung von Exporten importieren, müssen Sie explizit darauf hinweisen, indem Sie das Attribut ImportMany verwenden. Ändern Sie Ihre Immobilie Attribut wie folgt aus:

[ImportMany(typeof(IMenu))] 
public IEnumerable<IMenu> Menus { get; set; } 

Sie sollten auch in der Lage sein, den Vertrag auszuschließen (die „typeof (Menü)“ Parameter), da Sie die gleiche Art importieren, die exportiert wurde. Belassen Sie den Vertrag jedoch über die Export-Attribute.

[ImportMany] 
public IEnumerable<IMenu> Menus { get; set; } 
+0

bah..dang 5-Minuten-Timer. Wenn Sie die Antwort in wenigen Minuten nicht sehen, kommentieren Sie sie. – IAbstract

+0

Ich bekomme endlich den Dreh raus mit MEF. Bis jetzt bin ich ein Fan. – IAbstract

+0

Es ist eine wunderbare Bibliothek. Froh, dass ich helfen konnte, @dboarman! –

Verwandte Themen