2011-07-19 13 views
9

Czy istnieje sposób bezpiecznego korzystania z DirectoryCatalog do obsługi, jeśli katalog nie istnieje?MEF i DirectoryCatalog

Oto przykład kodu, jak mój pojemnik jest konfiguracja:

//Create an assembly catalog of the assemblies with exports 
    var catalog = new AggregateCatalog(
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new AssemblyCatalog(Assembly.Load("My.Second.Assembly")), 
     new DirectoryCatalog("Plugins", "*.dll")); 

    //Create a composition container 
    var container = new CompositionContainer(catalog); 

Ale jest wyjątek jeśli katalog nie istnieje, i chciałbym, aby zignorować ten błąd.

+1

jest jakiś powód, że nie można po prostu sprawdzić istnienie katalogu przed konfigurowania 'AggregateCatalog'? –

+0

Chciałbym, ale wydaje się, że w katalogu DirectoryCatalog znajduje się dobra logika do uzyskania poprawnej ścieżki (nie tylko bieżącego katalogu). Ktoś wie, czego używa? Assembly.Location? – jonathanpeppers

+0

Skomentowałem odpowiedź poniżej, ale wspomnę o tym tutaj ... nie powinieneś polegać na sprawdzaniu samego istnienia katalogów. Powinieneś wziąć pod uwagę wszelkie wyjątki IOExceptions, które chcesz obsłużyć (np. Jeśli katalog nie istnieje lub pliki są zablokowane, lub UAT itp.). –

Odpowiedz

9

Najwyraźniej nie, jeśli zostanie zgłoszony wyjątek. Po prostu utwórz katalog przed uruchomieniem konfiguracji kontenera MEF, a następnie nie zostanie zgłoszony żaden błąd.

Według the documentation:

Ścieżka musi być względną lub bezwzględną AppDomain.BaseDirectory.

PsuedoCode zrobić czek katalogu:

string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 

    //Check the directory exists 
    if (!Directory.Exists(path)) 
    { 
     Directory.CreateDirectory(path); 
    } 

    //Create an assembly catalog of the assemblies with exports 
    var catalog = new AggregateCatalog(
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new AssemblyCatalog(Assembly.Load("My.Other.Assembly")), 
     new DirectoryCatalog(path, "*.dll")); 

    //Create a composition container 
    _container = new CompositionContainer(catalog); 
+0

Zobacz mój komentarz powyżej. Jaką metodę wykorzystuje DirectoryCatalog, aby rozwinąć pełną ścieżkę? – jonathanpeppers

+0

Jest to wartość bezwzględna lub względna względem System.AppDomain.BaseDirectory. –

+0

Oznaczono jako odpowiedź. Zaktualizowałem Twój kod w odpowiedzi na to, czego użyłem. – jonathanpeppers