Próbuję to zrozumieć przez kilka dni, bez powodzenia.ImportMany z metadanymi nie importującymi
Próbuję użyć [ImportMany] do zaimportowania z katalogu pełnego bibliotek DLL z eksportami typu IEditorSystem, które mają niestandardowy metadane typu IEditorSystemMetadata. Chciałbym najpierw pobrać metadane i wypchnąć je do niektórych pól tekstowych itp., Aby użytkownik mógł wybrać, który system EditorSystem ma użyć, a po wybraniu załadować ten system ...
Podążałem za przykładami jak najlepiej jak tylko mogę, oto, co mam do tej pory.
[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
To jest to, co powinno być importowania:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}
i uruchamiania:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);
widzę w Catalog.Parts zarówno MyEditorSystem i ViewModel, które ma ImportMany, ale program EditorSystemList nigdy nie zostanie zapełniony. Nie otrzymuję błędów składu.
Pomyślałem, że może to mieć coś wspólnego z leniwym <>, więc próbowałem
public ObservableCollection<IEditorSystem> EditorSystemList
No szczęście albo.
Jedyną komplikacją, o jakiej mogę myśleć, jest to, że używam Cinch, który używa MEFedMVVM, który również używa MEF. Nie myślę, że to przeszkadza, ale nie jestem pewien.
Myślę, że robię to źle, czy ktokolwiek może to zrozumieć?
Aktualizacja:
Wdrożenie nowego IComposer, z dokładnie tego katalogu trzeba.
ImportMany nadal nie działa, ale tylko wtedy, gdy próbuję zaimportować z niego metadane. Metadane to tylko kilka ciągów i, o ile jestem w stanie to ustalić, podążam za przykładami.
W KOŃCU znaleziono przyczynę: Implementacje IEditorSystem znajdują się w oddzielnej bibliotece DLL, jak wspomniano wcześniej. Jednak wszystkie nowe kompilacje biblioteki dll nie są kopiowane do wyjściowego podrejestru głównego projektu. Skopiowałem pierwszy ręcznie i zapomniałem dodać kopię post-build do projektu dll. No cóż, nauczyłem się kilka rzeczy o MEF, więc nie całkowicie zmarnowane dni :)
Zmieniłem go na IEnumerable, ale import nigdy nie wydaje się gotowy, EditorSystemList pozostaje w [0] ... – Kage
Czy próbowałeś uruchomić dokładny kod z góry? powinieneś być w stanie stworzyć aplikację Console, aby to sprawdzić. – JoshVarga
Tak, konsola działa, ale wygląda na to, że może to być spowodowane tym, że MEFedMVVM zepsuł wszystko, zaktualizuje – Kage