2009-07-17 7 views
6

tengo 2 asambleas:¿El MEF (Framework de extensibilidad administrada) "tipa" el tipado?

de montaje 1:

interface IWeapon { 
    int Might { get; } 
} 

[Export("sword")] 
public class Sword : IWeapon { 

    public int Might { 
     get { return 10; } 
    } 
} 

Asamblea 2:

interface IWeapon { 
    int Might { get; } 
} 

var catalog = new AssemblyCatalog(typeof(Ninja.Sword).Assembly); 
var container = new CompositionContainer(catalog); 
// not allowed to use the IWeapon def in assembly 2 
var sword = container.GetExportedValue<IWeapon>("sword"); 

sé cómo conseguir que esto funcione. Puedo pedir el MEF (Framework de extensibilidad administrada) para el objeto, o hacer que exporte el IWeapon correcto en lugar de solo el nombre del objeto.

¿Puede MEF hacer la mecanografía "duck" y devolver un objeto proxy si se implementan todos los puntos de la interfaz?

Respuesta

5

Creo que estaba allí en las primeras versiones de MEF (emitiendo dinámicamente IL para la clase y devolviéndola) y se elimina ahora. Realmente no tiene sentido. Después de todo, su clase debe ser diseñada para implementar esa funcionalidad de complemento a través de una interfaz específica. Si puede agregar elementos como el atributo Export, también debería poder implementar la interfaz en su clase.

+0

El problema que veo es de versiones, si el conjunto de la base cambia versiones, todas las extensiones pueden necesitar recompilación. –

+1

Resolvería ese problema moviendo la interfaz a un ensamblaje por separado. La versión de ese ensamblaje debería cambiar solo si el contrato real cambia. –

+0

Sí, he pensado en eso, sigue siendo un poco molesto porque ahora tendré que hacer un seguimiento de 2 ensamblajes diferentes (implementar 2 ensamblajes, etc.), supongo que es la forma correcta de hacer las cosas con .Net –

1

Si sus dos clases de IWeapon tienen el mismo COM Guid entonces puede acercarse a pato escribir utilizando equivalencia de tipo en .NET 4. Es realmente bueno para versiones y actualizar el soporte de complementos con MEF es decir Tener un contrato de v2 que pueda también carga plugins que solo implementan v1 del contrato. Aquí hay un buen artículo sobre el tema.

http://blogs.msdn.com/b/delay/archive/2011/03/09/mef-addict-combining-net-4-s-type-embedding-and-mef-to-enable-a-smooth-upgrade-story-for-applications-and-their-extensions.aspx

+0

Eso es bastante genial. –

Cuestiones relacionadas