Nie rozumiem MEF bardzo dobrze, więc mam nadzieję, że jest to prosta poprawka, jak myślę, że to działa.MEF GetExports <T, TMetaDataView> nic nie zwracając z AllowMultiple = True
Próbuję użyć MEF, aby uzyskać informacje o klasie i sposobie jej użycia. Używam opcji Metadane, aby spróbować to osiągnąć. Moi interfejsy i atrybut wygląda następująco:
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; }
}
Klasa, która jest ozdobiona atrybutu wygląda następująco:
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
Metoda, która stara się wykorzystać import wygląda następująco:
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
W moim przypadku myExports
jest zawsze pusty. W moim CompositionContainer, mam część w moim katalogu, która ma dwa ExportDefinitions
, oba z następującym ContractName
: "MyNamespace.IMyInterface". Numer Metadata
jest również poprawnie wczytywany do mojego eksportu.
Po usunięciu settera AllowMultiple
i uwzględnieniu tylko jednego eksportowanego atrybutu zmienna myExports
ma teraz pojedynczy eksport z załadowanymi metadanymi.
Co robię źle?
EDIT: Jeśli użyję słabo wpisane Metadane, mój eksport jest nagle spełnione:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
Jakieś pomysły dlaczego?
Tak, to, co skończyło się robi, po przeczytaniu następujący artykuł: http://blogs.microsoft.co. il/blogs/bnaya/archiwum/2010/01/29/mef-for-beginner-repeatable-metadata-part-9.aspx Miałem zamiar opublikować to wczoraj, ale zostałem wciągnięty w inne rzeczy, zanim mogłem dokończyć, więc ciesz się z twoich punktów ! – sohum
Nie ma potrzeby, aby klasa dziedziczyła z "Atrybutu" zamiast "Eksportuj atrybut". Celem 'MetadataAttributeAttribute' jest zwięzłość i precyzja ;-).Używanie niestandardowego widoku metadanych i ręczne radzenie sobie z tablicami działa dla mnie. Z dokumentacji nie wynika, że 'AllowMultiple' powoduje, że wpisy metadanych stają się tablicami, więc dziwne ... – binki