Pregunta

Estoy un poco perdido con Mef, Maf, Unity ...

Esta pregunta es sobre la arquitectura de la aplicación WinForm.

Tengo un proyecto principal que contiene una forma principal y algunos otros formularios;

Porque quiero incluir modularidad, estoy pensando en usar un sistema de complementos.

Lo que me gustaría hacer es Abrir cada complemento DLL Cuando la aplicación principal se abre para hacer referencia a cada uno con el botón, Barra de herramientas ...

Entonces me gustaría disponer ellos hasta que se llamen.

Pero no quiero que todos los complementos se mantengan en la memoria ... solo para obtener un buen modelo de arquitectura.

Así que primero sobre .net: Dotnet mantiene solo un referencia a los complementos dll en la memoria o todo el código de complemento ?

Estoy pensando en usar MEF con LAZY Colección de importación, pero primero necesito instanciarlos para obtener la información de mis botones. Entonces segunda pregunta

Si establecí la colección de importación en null y lauch el compose() Funcionar nuevamente, ¿los complementos se cargarán o esperarán hasta que la llamada se cargue (perezoso)?

¿Fue útil?

Solución

Entonces me gustaría deshacerme hasta que se les llame.

En lugar de inspeccionar objetos importados y luego tirarlos, debe inspeccionar la importación metadatos. Puedes obtener estos metadatos importando Lazy<IFoo,IFooMetadata> o Lazy<IFoo,Dictionary<string,object>>. Puede agregar estos metadatos a las exportaciones con el ExportMetadata atributo.

Entonces, primero sobre .NET: ¿Dotnet mantiene solo una referencia a los complementos DLL en la memoria o todo el código de complemento?

Una vez que se carga un ensamblaje, permanece en la memoria, a menos que descargue todo el appdomain.

Además, no hay implementaciones listos para usar ComposablePartCatalog en .NET 4.0 que se puede consultar sin cargar el ensamblaje correspondiente. Pero en teoría, se podría hacer algo así si almacena los metadatos en algún lugar fuera de la asamblea. Hay una muestra de dicha implementación en el Código MEF en CodePlex.

Estoy pensando en usar MEF con la colección perezosa de importación

El uso de importaciones perezosas no necesariamente evitará que se carguen los ensamblajes. Si tiene una referencia a un Lazy<IFoo> objeto, luego al menos el ensamblaje que contiene IFoo tiene que ser cargado. Y como expliqué anteriormente, el ensamblaje que contiene el exportado IFoo La implementación también se habrá cargado en ese momento.

El uso de Lazy solo pospondrá la invocación de algunos constructores, con suerte, lo que resulta en un inicio más rápido de su aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top