2009-05-19 6 views
3

J'ai une exportation définie comme comme suit MEF preview 5partie d'importation avec des métadonnées spécifiques à l'aide MEF Preview 5

[ExportMetadata("Application", "CheckFolderApplication")] 
[Export(typeof(ExtendedArtifactBase))] 
public class CheckFolderArtifact2 : ExtendedArtifactBase 
{ ... 

Je ne veux que ces importations avec les métadonnées « Application » de « CheckFolderApplication ». Pour ce faire, je lis tous les les importations, puis filtrer le résultat.

[Import(typeof(ExtendedApplicationBase))] 
private ExportCollection<IApplication> _applications { get; set; } 

public IApplication GetApplication(string applicationName) 
{ 
    return _applications.Single(a => a.GetExportedObject().Name == applicationName).GetExportedObject(); 
} 

Cela semble vraiment inefficace. Que se passe-t-il si j'ai des milliers de plug-ins - dois-je les lire tous via MEF pour en obtenir un avec les bonnes métadonnées? Si oui, comment cachez-vous le résultat?

Répondre

3

Oui, dans ce cas vous devrez faire le filtrage vous-même.

Pour mettre en cache le résultat, vous pouvez simplement le stocker dans une autre variable privée. Si vous souhaitez prendre en charge recomposition (vous devez définir la propriété AllowRecomposition de l'attribut import sur true), vous pouvez implémenter IPartImportsSatisfiedNotification sur votre classe et la méthode OnImportsSatisfied de l'interface sera appelée à chaque fois que les importations ont été définies.

+0

Merci Daniel, c'est une application web ASP.NET MVC, je dois trouver une autre façon de la mettre en cache ... – Riri

+0

Cette situation est-elle modifiée à tout en .Net 4.0 ou est-ce toujours la même chose? –

+0

@Tim C'est toujours la même chose dans .Net 4. –

0

Je me suis retrouvé vouloir faire quelque chose de similaire. J'ai finalement importé Lazy et le filtrage sur les métadonnées, comme un moyen, espérons-le, d'éviter d'instancier les objets réels à l'avance.

[ImportMany(typeof(MyInterface))] 
List<Lazy<MyInterface,MyMetadataType>> MyGuys { get; set; } 

(Et avec des métadonnées typé fort - J'ai aussi utilisé la fonction où vous pouvez créer un MyMetadataType d'interface avec lecture seule obtient, et passer qu'au lieu de mettre en TMetadata = IDictionary)

J'imagine MEF a encore lire au moins les métadonnées de tous les 'milliers de plugins' ...

Questions connexes