2011-04-15 7 views
6

Esto es similar a cómo se ve mi código¿Descarta el contenedor MEF los catálogos añadidos?

var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
_container = new CompositionContainer(catalog); 

análisis de código está mostrando un aviso CA2000: llamar a Dispose en el catálogo antes de todas las referencias a ella están fuera de alcance.

Así que no estoy seguro de si necesito suprimir la advertencia o poner _catalog en un campo + Eliminarlo.

Los documentos MEF no parecen mencionar esto.

Respuesta

4

De acuerdo con el código fuente MEF Preview 9 (que probablemente coincide estrechamente con el código que se envió en .NET 4) CompositionContainer envolverá el catálogo en un CatalogExportProvider. Este proveedor de exportación se almacena en un campo y se elimina junto con el contenedor. Sin embargo, CatalogExportProvider.Dispose será no a su vez desecha el ComposablePartCatalog envuelto.

Por lo tanto, la respuesta es no: CompositionContainer no desecha el catálogo.

Esto se puede comprobar mediante la ejecución de este código, que no se imprimirá nada en la consola:

class MyCatalog : ComposablePartCatalog 
{ 
    protected override void Dispose(bool disposing) 
    { 
     Console.WriteLine("Disposed!"); 
     base.Dispose(); 
    } 

    public override IQueryable<ComposablePartDefinition> Parts 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new CompositionContainer(new MyCatalog()); 
     container.Dispose(); 
     Console.ReadKey(); 
    } 
} 
+0

¡Ah! crear la técnica de subclases personalizada :) Mi copia de reflector se terminó y era viernes, así que lo publiqué en SO. Gracias Wim! – Gishu

3

Como ya se descubrió Wim ni el CompsitionContainer ni el CatalogExportProvider llamarán a disponer en el catálogo. Ninguno de los dos creó el catálogo, ninguno de los dos lo posee y, como tal, no lo llamará Dispose. Quien construya el catálogo debería ser quien lo disponga.

Hay muchos escenarios en los que alguien desearía compartir una instancia de catálogo con varios contenedores, por lo que el contenedor no tiene la propiedad del catlaog y, por lo tanto, no lo elimina.

+0

Todos los documentos no resaltan esto: los ejemplos son generalmente de la forma 'var container = new CompositionContainer (new SomeCatalog())'. ¿Es porque está bien no desechar el catálogo? ¿No tiene importantes interrupciones de recursos? – Gishu

+0

Los catálogos predeterminados solo tienen bloqueos que posiblemente deban descartarse, pero finalmente se limpiarán. En general, las muestras presuponen que tiene un contenedor para la aplicación y, una vez que haya terminado, la aplicación se cierra y en ese momento los recursos del sistema operativo se limpiarán de todos modos. –

Cuestiones relacionadas