2009-06-16 6 views
4

Est-il possible de marquer une interface pour l'exportation, de sorte que toutes les classes dérivées seront disponibles pour l'importation?MEF: Mark interface pour l'exportation

[Export(typeof(IMyInterface))] 
public interface IMyInterface { ... } 

[Import(typeof(IMyInterface))] 
private readonly ICollection<IMyInterface> m_Concretes = new Collection<IPlugin>(); 

Je ne sais pas quelles classes mettent en œuvre IMyInterface dans cet exemple. Les classes elles-mêmes ne connaissent rien à propos de MEF - et n'utilisent pas l'attribut [Export].

Tant que je ne marque pas chaque classe avec [Export] cela ne semble pas fonctionner pour moi.

Répondre

4

Dans l'aperçu en cours, vous pouvez essayer de placer un attribut [PartExportsInherited] sur l'interface (avec l'attribut Exporter). Je ne suis pas sûr si cela fonctionnera pour les interfaces ou non, cependant.

Nous prévoyons d'ajouter un support pour mettre des exportations sur des interfaces.

+0

Merci - cela fonctionne sur les interfaces, aussi. – tanascius

3

Oui, dans l'aperçu actuel sur le codeplex, vous pouvez marquer l'interface avec PartExportsInherited et Export pour que tous les implémenteurs soient automatiquement exportés. Dans une version de prévisualisation à venir, nous allons probablement rationaliser cela pour simplement placer un seul attribut, peut-être quelque chose comme [InheritedExport]. Editer: Avec l'aperçu MEF 6, cela peut maintenant être fait en plaçant l'attribut InheritedExport sur l'interface.

+0

est-il un moyen de le faire à travers les attributs? I.E. [InheritedExport] public class Cat: Attribut { } [Chat] public class Ruth {} ......... [ImportMany (Cat)] IEnumerable chats; // les chats contiendront "Ruth" – Mike

2

Mise à jour: Utilisation de MEF v4. Comme prévu, tout ce qui hérite de IMyInterface sera exporté en tant que tel. Comme prévu, tout ce qui hérite de IMyInterface sera exporté comme un seul.

Utilisez [ImportMany] les ont tous injecté:

[ImportingConstructor] 
public void MyClass([ImportMany] IEnumerable<IMyInterface> myDerivedObjects)