10
votes

Appliquer un attribut wcf à toutes les méthodes du service

J'ai un attribut personnalisé que je souhaite appliquer à chaque méthode de mon service WCF.

Je procède comme ceci: xxx

Le problème est que mon service est que mon service est que mon service Contient des centaines de méthodes et je ne veux pas écrire [Attribut] avant tout. Existe-t-il un moyen d'appliquer l'attribut à toutes mes méthodes de mon service?

Voici la signature de mon attribut: xxx

Modifier après la réponse d'Aliostad :

J'ai essayé ceci: xxx

et que: xxx

mais il ne fonctionne toujours pas.


1 commentaires

Dépend de l'attribut spécifique et, plus important encore, sur quel code le consomme.


5 Réponses :


7
votes

Selon iserviceBehaviour documentation, si Vous implémentez cette interface et créez un attribut et mettez-le au niveau de la classe, il sera appliqué à toutes les opérations:

Créer un attribut personnalisé qui implémente iserviceBehavior et l'utiliser Pour marquer les cours de service qui doivent être modifié. Quand un objet ServiceHost est construit, utilise la réflexion à Découvrez les attributs sur le service taper. Si des attributs mettent en œuvre Iservicebehavior, ils sont ajoutés à la collection de comportements sur ServiceDescription.

update

au lieu de la mise en œuvre ioperationbehaviour , ajoutez le comportement requis dans le iservicebehaviour par boucle Opérations : xxx


3 commentaires

Merci de votre aide. Vous avez raison, j'applique cet attribut à la classe et une partie de cela fonctionne, mais la partie qui utilise ioperationBehavior Wont fonctionne si je ne l'applique pas à toutes les méthodes.


Merci, regarde dans mon édition pour voir ce que j'ai essayé.makes parfaits, mais ça ne marche toujours pas.


Ok, laissez-moi vous revenir après votre retour à la maison.



0
votes

Définir l'attribut comportemental de service, appliquez l'attribut sur le niveau de service. Dans le comportement, itérale à toutes les méthodes définies dans le contrat et faire toutes les choses MyAttribute.


1 commentaires

Cela ne fonctionnera pas à moins que vous réécrivez la façon dont ServiceHost Découvrez les méthodes d'exposition dans le service



-1
votes

Vous pouvez envisager d'utiliser des actions AOP ou post-construction, afin d'injecter des attributs dans le code compilé.


2 commentaires

Comment? La question est de savoir comment?


@SaeedNeamati Lire des documents pour presque toute la bibliothèque de AOP pour .NET, comme postsharp, AOP.NET, etc. Ils ont la capacité d'être inclus dans l'action post-construction. Si vous avez une question particulière à ce sujet, n'hésitez pas à le demander ici.



9
votes

Les éléments suivants doivent faire l'affaire en utilisant le comportement de service pour ajouter le comportement opérationnel correct qui appelle l'invocateur.

public class MyAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
    #region IServiceBehavior Members
    public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase host)
    {
        foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                operation.Behaviors.Add(this);
            }
        }
    }
    ...
    #endregion

    #region IOperationBehavior Members
    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.Invoker = new OperationInvoker(dispatchOperation.Invoker);
    }
    ...
    #endregion
}


3 commentaires

Cela ressemblait à une bonne réponse à moi, mais cela n'a pas fonctionné non plus


J'utilise cela dans le code de production aujourd'hui et je travaille. Je ne suis pas sûr que le problème que vous rencontrez. Je ne sais pas comment aider davantage. J'ai vérifié le code et rien ne se distingue différent de mon code de production. Merci.


@Aarron intainback mea cupa! Votre code a parfaitement travaillé; J'ai juste oublié de supprimer le lancer notimplementaedException () inséré par VS Studio :). Merci



-2
votes

Pourquoi vous n'utilisez pas T4 pour générer des codes reproductibles? Il est préférable que nous utilisons la réflexion en temps de compilation que le temps d'exécution.

La méthode de service logiquement est l'appelant d'une méthode commerciale. Vous pouvez donc générer facilement des méthodes de service avec les attributs nécessaires en lisant des méthodes publiques de classe d'entreprise. Il suffit de faire attention lorsque nous mettons en œuvre la classe d'affaires.


0 commentaires