2009-11-17 7 views
5

Estoy probando el Framework de Extensibilidad Administrado por primera vez en Visual Studio 2010 beta 2 usando System.ComponentModel.Composition desde .net-4.0.Indique a MEF que use cualquier conjunto disponible

No he podido obtener CompositionContainer para encontrar mis ensamblajes de implementación usando las dos rutinas alternativas a continuación.

primer intento (esto funcionó en un comunicado de CodePlex mayor de MEF):

var composition = new CompositionBatch(); 
composition.AddPart(this); 
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
container.Compose(composition); 

Segundo intento (esto funcionó en beta 1, creo):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var compositionContainer = new CompositionContainer(aggregateCatalog); 
compositionContainer.ComposeParts(this); 

¿Hay una nueva forma hacer esto en beta 2?

EDITAR: Resultó que no tenía nada que ver con la composición. Tenía una propiedad estática que representa mi aplicación importada:

[Import] public static ILog Log { get; set; } 

que debería haber sido:

[Import] public ILog Log { get; set; } 

que marcó la respuesta de Daniel como aceptada porque el sabio consejo de depuración de una manera más exhaustiva resolvió el problema.

+0

He estado usando Beta 2 durante unas semanas y ahora han estado utilizando su segundo ejemplo sin ningún problema. ¿Tiene partes internas en su ensamblaje en ejecución o solo están ubicadas en BaseDirectory? ¿Ha podido confirmar a qué AppDomain.CurrentDomain.BaseDirectory se asigna en tiempo de ejecución? Además, ¿la clase que contiene los fragmentos anteriores contiene alguna Importación declarada? Solo me aseguro de que no se recogerá nada si la instancia de la clase (esto) no tiene ninguna importación. – JamesEggers

+0

Debo estar haciendo algo tonto. Las implementaciones son simples mientras trato de hacerlo funcionar. BaseDirectory es válido, la clase tiene las importaciones. Aún así, un poco más irritante y llegaré al final. – grenade

+0

¿Alguien puede explicar por qué no es posible usar [Importar] para una propiedad estática? – Dave

Respuesta

1

¿Qué está fallando? ¿Hay alguna importación que esperas que esté satisfecha y que no esté siendo satisfecha? ¿Estás llamando a GetExports() y está fallando?

Puede interrumpir el depurador después de que se haya creado el catálogo, y pase el ratón sobre la variable aggregateCatalog para inspeccionarlo y ver qué partes hay en él. Supongo que probablemente las partes estén en el catálogo, y el problema está en otro lugar de tu código. Una posible causa es que tiene una importación de colección que está utilizando el atributo [Importar] en lugar de [ImportMany], y/o que sus piezas están siendo rechazadas porque tienen importaciones que no pueden ser satisfechas.

0

Eche un vistazo al método Compose en el SoapBox Core Host, puede verlo usando un Catálogo de directorios para encontrar todas las partes en el directorio. Sin embargo, esto no se compila contra .NET 4, justo en contra de la versión preliminar del MEF:

private bool Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      MessageBox.Show(compositionException.ToString()); 
      return false; 
     } 
     return true; 
    } 
Cuestiones relacionadas