2011-07-19 11 views
9

¿Hay alguna forma de usar DirectoryCatalog de forma segura para gestionar si el directorio no existe?MEF y DirectoryCatalog

Aquí un ejemplo de código de cómo mi contenedor es de configuración:

//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); 

Pero se produce una excepción si el directorio no existe, y me gustaría hacer caso omiso de ese error.

+1

¿Hay una razón por la que no se puede simplemente comprobar la existencia del directorio antes de instalar el 'AggregateCatalog'? –

+0

Lo haría, pero parece que hay una buena lógica integrada en DirectoryCatalog para obtener la ruta correcta (no simplemente el directorio actual). Alguien sabe lo que usa? Assembly.Location? – jonathanpeppers

+0

Comenté la respuesta a continuación, pero también lo mencionaré aquí ... no debe confiar en comprobar la existencia de directorios solo. Debe tener en cuenta las IOExcepciones que desee controlar (es decir, si el Directorio no existe, o si los archivos están bloqueados, o UAT, etc.) –

Respuesta

9

Aparentemente no si se produce una excepción. Simplemente cree el directorio antes de ejecutar la configuración del contenedor MEF y luego no se generará ningún error.

Según the documentation:

La ruta debe ser absoluta o relativa a AppDomain.BaseDirectory.

psuedocode hacer una verificación de directorio:

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

Consulte mi comentario anterior. ¿Qué método utiliza DirectoryCatalog para expandir la ruta completa? – jonathanpeppers

+0

Es absoluto o relativo a System.AppDomain.BaseDirectory. –

+0

Marcado como respuesta. Actualicé tu código en tu respuesta a lo que utilicé. – jonathanpeppers