2011-08-04 9 views
12

Używam MEF do ładowania wtyczek w mojej aplikacji. Wszystko działa, ale chcę, aby odkryto nowe części, gdy zostaną umieszczone w folderze mojej aplikacji. czy to możliwe? DirectoryCatalog ma zdarzenie Changed, ale nie jestem pewien jak to działa.Jak odkrywać nowe części MEF podczas działania aplikacji?

To jest mój kod teraz:

public sealed class RevealerFactory 
{ 
    private static readonly Lazy<RevealerFactory> lazy = 
      new Lazy<RevealerFactory>(() => new RevealerFactory()); 

    public static RevealerFactory Instance { get { return lazy.Value; } } 

    private FileSystemWatcher watcher; 

    private RevealerFactory() 
    { 
     Initialize(); 
    } 

    [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] 
    private IEnumerable<Lazy<IRevealer, IRevealerCapabilities>> Revealers { 
     get; 
     set; 
    } 

    public IRevealer GetRevealer(Uri uri) 
    { 
     return (from revealer in Revealers 
       where uri.Host.Equals(revealer.Metadata.Host, 
             StringComparison.OrdinalIgnoreCase) 
        && revealer.Value.IsRevelable(uri) 
       select revealer.Value).FirstOrDefault(); 
    } 

    private void Initialize() 
    { 
     var catalog = new DirectoryCatalog(
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
             + "/SDownloader/Revealers"); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 
    } 
} 

Odpowiedz

21

Można użyć FileSystemWatcher wykryć nowe biblioteki DLL są opuszczane w folderze wtyczek. Następnie możesz obsłużyć takie zdarzenia, dzwoniąc pod numer DirectoryCatalog.Refresh lub AggregateCatalog.Catalogs.Add, aby zaktualizować kompozycję MEF o nowe części.

Niektóre rzeczy mieć świadomość:

  1. Trzeba zaznaczyć swoje MEF importu jako przeznaczony do czynienia z rekompozycję, jak wyjaśniono w MEF odcinka prowadzącego programowanie na Recomposition. W przeciwnym razie MEF zgłosi błąd podczas próby ich aktualizacji.

  2. FileSystemWatcher przenosi zdarzenia na wątki puli wątków systemowych (chyba że użytkownik korzysta z właściwości SynchronizingObject). Pamiętaj, że jeśli zadzwonisz pod numer DirectoryCatalog.Refresh z innego wątku, musisz skonfigurować CompositionContainer z włączoną opcją . Będziesz także musiał pomyśleć o bezpieczeństwie wątków w ustawieniach nieruchomości, które będą wywoływane, gdy kompozycja zostanie zaktualizowana.

  3. Możesz również usunąć katalogi, usuwając je z kolekcji AggregateCatalog.Catalogs. Ale nie ma sposobu na rozładowanie skojarzonych złożeń (z wyjątkiem rozładowania całego Appdomain). Oznacza to również, że nadal nie można usunąć lub nadpisać zespołu podczas działania aplikacji.

+3

dodatkowo możesz rozważyć włączenie kopiowania w tle, aby umożliwić wymianę na gorąco swoich zespołów – tartakynov

+0

@tartakynov jak włączyć kopiowanie w tle? – zionpi

+0

@zionpi sprawdź ten temat http://stackoverflow.com/questions/4595304/change-dll-loaded-with-mef – tartakynov