2009-07-17 1 views
6

Ho 2 gruppi:MEF (Managed Extensibility Framework) esegue la digitazione "duck"?

di montaggio 1:

interface IWeapon { 
    int Might { get; } 
} 

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

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

Assemblea 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"); 

io so come farlo funzionare. Posso chiedere al MEF (Managed Extensibility Framework) per l'oggetto, o farlo esportare l'IWeapon corretto invece che solo l'oggetto per nome.

MEF può digitare "duck" per me e restituire un oggetto proxy se tutti i punti di interfaccia sono implementati?

risposta

5

Penso che fosse presente nelle prime versioni di MEF (emettendo dinamicamente IL per la classe e restituendola) e ora viene rimosso. Non ha davvero senso. Dopo tutto, la classe deve essere progettata per per implementare tale funzionalità aggiuntiva tramite un'interfaccia specifica. Se puoi aggiungere cose come l'attributo Export, dovresti essere perfettamente in grado di implementare l'interfaccia anche sulla tua classe.

+0

Il problema che vedo è versioning, se il gruppo base cambia versioni, tutte le estensioni possono avere bisogno di ricompilazione. –

+1

Risolvo il problema spostando l'interfaccia in un assembly separato. La versione di quell'assembly dovrebbe cambiare solo se il contratto effettivo cambia. –

+0

Sì, ho pensato a questo, è ancora un po 'fastidioso perché ora dovrò tenere traccia di 2 diversi gruppi (distribuire 2 assiemi, ecc.), Immagino sia il modo corretto di fare le cose con .Net –

1

Se entrambe le classi IWeapon hanno lo stesso COM Guid, è possibile avvicinarsi alla digitazione utilizzando l'equivalenza di tipo in .NET 4. È molto utile per il controllo delle versioni e dell'aggiornamento dei plugin con MEF, ovvero Avere un contratto v2 che può caricare anche plugin che implementano solo la v1 del contratto. Ecco un buon articolo sull'argomento.

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

Questo è dannatamente bello. –