2016-10-30 2 views
1

J'ai une application qui utilise Managed Extensibility Framework (MEF) avec ASP.NET MVC 5. Cette architecture me permet d'avoir une conception enfichable où je peux créer plusieurs applications et les exécuter toutes en une seule application maître. Cela m'a également permis d'avoir une place centrale pour l'authentification et la validation/le chargement des permissions.Comment créer un wrapper pour l'attribut Export lors de l'utilisation de MEF avec C#?

Pour que MVC 5 fonctionne avec MEF, chaque contrôleur doit avoir une valeur d'exportation unique. Par conséquent, je dois ajouter ces deux codes de ligne à chacun de mon contrôleur

[Export("SomeUniqueValue1", typeof(IController))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 

Pour la valeur d'exportation unique à chaque plug-in, je tiens à concaténer le nom du plug-in aux valeurs d'exportation. donc au lieu d'utiliser les 2 lignes ci-dessus, je vais utiliser quelque chose comme ça à la place

[Export("PluginName.SomeUniqueValue1", typeof(IController))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 

Maintenant, j'espère gagner du temps de codage en éliminant les 2 lignes de code ci-dessus si un seul comme. J'espère que quelque chose comme la ligne ci-dessous

[MefExport("SomeUniqueValue1")] 

Ensuite, la classe MefExport, se chargera de la concaténation du nom du plugin au nom fourni, et appelle en quelque sorte la classe Export et la PartCreationPolicy

Comment puis-je créer un classe "ie MefExport" qui s'étend Export classe qui me permet d'ajouter le nom du plugin et appeler le Export et le PartCreationPolicy?

C'est ce que j'ai commencé avec

public class MefExport : ExportAttribute 
{ 
    public MefExport(string exportName) 
    { 
     string finalExportValue = Helpers.GetPluginName() + exportName; 

     new ExportAttribute(finalExportValue, typeof(IController)); 
    } 
} 
+1

La réponse donnée par Will Ray, est une bonne solution pour votre problème, mais je vous suggère d'être plus descriptif avec votre attribut d'exportation. Imo, '[MEFExport]' pourrait être mieux nommé comme quelque chose comme '[MEFControllerExport]' ou '[ControllerExport]'. De cette façon, vous aurez plus de place pour plus de définitions de plugin plus tard sans le problème d'être ambigu. – Silvermind

Répondre

2

Je ne pense pas que vous pouvez raisonnablement combiner les deux attributs en une seule. Le PartCreationPolicyAttribute est une classe scellée et le code qui cherche cet attribut aura besoin précisément de ce type.

Cependant, vous pouvez simplifier le premier bit en appelant la classe de base avec vos valeurs calculées:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = false)] 
public sealed class MefExportAttribute : ExportAttribute 
{ 
    public MefExportAttribute(string exportName) 
     : base(GetContractName(exportName), typeof(IController)) 
    { 
    } 

    private static string GetContractName(string exportName) 
    { 
     return Helpers.GetPluginName() + exportName; 
    } 
} 

(Je viens de copier AttributeUsage de la ExportAttribute valeurs - vous pouvez avoir des besoins différents de cette coutume attribut.)

+0

Merci pour cela. Que fait cette ligne? '[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]' – Jaylen

+0

@Jaylen Il définit comment l'attribut est autorisé à être utilisé dans le code. Pour cette instance, vous pouvez dire que "Le MefAttribute peut être utilisé sur des classes, des méthodes, des propriétés et des champs.Il peut être utilisé plus d'une fois sur l'une de ces choses.Les classes qui surchargent ou héritent de ces choses n'héritent pas de cet attribut " –

+0

Je reçois une erreur lors de l'utilisation de cet attribut 'Aucune exportation trouvée correspondant à la contrainte: ContractName SomeUniqueValue RequiredTypeIdentity System.Web.Mvc.IController' – Jaylen