2010-12-06 8 views
5

Tengo una pregunta acerca de la siguiente excepción que recibí tratando de completar una llamada a .ComposeParts(this):Tratando de averiguar lo que significa este error Composición MEF

La composición produjo un solo error composición. La causa raíz es que se proporciona a continuación. Revise la propiedad CompositionException.Errors para obtener información más detallada.

1) La exportación 'CustomersModule.CustomerMenu (ContractName = "ModLibrary.IMenu")' es no asignable para escribir 'System.Collections.Generic.IEnumerable`1 [[ModLibrary.IMenu, ModLibrary, Versión = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] '.

El resultado es: No se puede establecer la importación 'ModAppWorks.Host.Menus (ContractName = "ModLibrary.IMenu")' en la parte 'ModAppWorks.Host'. Elemento: ModAppWorks.Host.Menus (ContractName = "ModLibrary.IMenu") -> ModAppWorks.Host

Hay una parte que parece no significa que el error IMenu deben implementar IEnumerable. Aquí está mi código composición:

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 

Estoy importando una clase que casos un ToolStripMenuItem. Mi muestra de exportación:

[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 

Si es IMenuno requerido para implementar IEnumerable, ¿alguien ve algo que podría estar haciendo mal?

Respuesta

6

Cuando está importando una colección de exportaciones, debe ser explícito con el atributo ImportMany. Cambiar su atributo de propiedad como esta:

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

También debe ser capaz de excluir el contrato (el "typeof (Menú)" parámetro), ya que está importando el mismo tipo que se exportó. Sin embargo, deje el contrato en los atributos de exportación.

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

bah..dang 5 minute timer. Si no ve la respuesta aceptada en unos minutos ... comente de nuevo. – IAbstract

+0

Finalmente me estoy acostumbrando al uso de MEF. Hasta ahora, soy un fan. – IAbstract

+0

Es una biblioteca increíble. Me alegro de poder ayudar, @dboarman! –

Cuestiones relacionadas