2012-03-09 16 views
7

estoy exportación de algunas clases que implementan la interfaz IFoo como estoImportación muchos casos utilizando MEF

public interface IFoo { } 

[Export("A", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export("B", typeof(IFoo))] 
public class Foo2 : IFoo { } 

Cuando intento importar uno de ellos utilizando

containter.GetExportedValue<IFoo>("A"); 

funciona bien pero cuando intento para importar todos ellos de esta manera

[ImportMany] 
IFoo[] foos; 

no funciona.

¿Alguien me puede decir cómo solucionar esto?

+0

Pregunta: ¿no debería ser foos una propiedad con un get; conjunto; ? – labroo

Respuesta

9

Para tener las dos cosas, declaran las exportaciones 2:

public interface IFoo { } 

[Export(typeof(IFoo))] 
[Export("A", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo))] 
[Export("B", typeof(IFoo))] 
public class Foo2 : IFoo { } 

entonces debería funcionar (i hizo una muestra de prueba y tengo que trabajar).

HTH,

Bab.

+0

Hola @Baboon, pensé que al usar [Exportar (cadena, Tipo)] ambos exportan al mismo tiempo. – Michelle

+0

Esto funciona maravillosamente. Además, si omite el nombre en una de las exportaciones, se convierte en el valor predeterminado, lo que es realmente útil para eludir ciertos tipos de dependencias circulares. – Contango

+0

¿hay alguna manera en que puedo hacer [ImportMany] y todavía obtener los nombres de los contratos? –

3

Elimine los nombres de los contratos en sus exportaciones.

[Export("A", typeof(IFoo))] 

Para

[Export(typeof(IFoo))] 

En el primer escenario que va a exportar un contrato que coincide con el nombre de "A" y el tipo IFoo, mientras que en su importación muchos está importando todo lo que coincide con un contrato de tipo IFoo (sin nombre de contrato), por lo que las exportaciones con nombres de contrato no se consideran.

Como mencionó el babuino, puedes tenerlo en ambos sentidos. Debería considerar si necesita los dos en su aplicación, si no es así, me quedaría con una sola forma de mantener las cosas lo más simple posible, de lo contrario, sugiero usar su enfoque.

+1

Sí, pero luego ya no puede importar solo "A". –

+0

@Baboon: me pregunto si sería posible en este caso exportar la pieza con y sin el contrato para hacer uso de ambos tipos de importaciones. Pero no sé si realmente es necesario en este caso. – Gilles

+0

Hola @Gilles, Baboon tiene razón. Necesito usar ambas formas para importarlas. – Michelle

Cuestiones relacionadas