MEF GetExports <T, TMetaDataView> no devuelve nada con AllowMultiple = True
No entiendo muy bien a MEF, así que espero que esta sea una solución simple de cómo creo que funciona.
Estoy tratando de usar MEF para obtener información sobre una clase y cómo debe usarse. Estoy usando las opciones de Metadatos para tratar de lograr esto. Mis interfaces y atributos se ven así:
public interface IMyInterface
{
}
public interface IMyInterfaceInfo
{
Type SomeProperty1 { get; }
double SomeProperty2 { get; }
string SomeProperty3 { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportMyInterfaceAttribute : ExportAttribute, IMyInterfaceInfo
{
public ExportMyInterfaceAttribute(Type someProperty1, double someProperty2, string someProperty3)
: base(typeof(IMyInterface))
{
SomeProperty1 = someProperty1;
SomeProperty2 = someProperty2;
SomeProperty3 = someProperty3;
}
public Type SomeProperty1 { get; set; }
public double SomeProperty2 { get; set; }
public string SomeProperty3 { get; set; }
}
La clase que está decorada con el atributo se ve así:
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
El método que está tratando de usar la importación se ve así:
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
En mi casomyExports
siempre está vacío. En mi CompositionContainer, tengo una parte en mi catálogo que tiene dosExportDefinitions
, ambos con los siguientesContractName
: "MyNamespace.IMyInterface". losMetadata
También se carga correctamente por mis exportaciones.
Si quito elAllowMultiple
y solo incluye un atributo exportado, elmyExports
La variable ahora tiene la exportación única con sus metadatos cargados.
¿Qué estoy haciendo mal?
EDITAR: Si utilizo metadatos de tipo débil, mi exportación queda repentinamente satisfecha:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
¿Alguna idea de por qué?