6 votes

WCF et l'héritage d'interface - Est-ce une chose terrible à faire ?

Mon application comporte 2 "services", disons que l'un est une calculatrice de base (entiers) et l'autre une calculatrice à virgule flottante. Je les exprime sous forme d'interfaces comme suit :

public interface IBasicCalculator
{
    int Add( int a, int b );
}

public interface IFloatingPointCalculator
{
    double Add( double a, double b );
}

Je veux les exposer via WCF. Malheureusement, WCF semble être très étroitement lié à la notion que chaque opération possible que vous voulez exposer doit passer par une seule interface de service - vous ne pouvez pas partager des sessions entre les services, c'est encombrant du côté client car vous devez créer un proxy distinct pour chacun d'eux, il ne semble pas y avoir de "sous-services", etc...

J'ai donc compris que je devais présenter une interface "combinée" (on pourrait aussi l'appeler une façade), comme ceci :

[ServiceContract]
public interface ICalculatorService : IBasicCalculator, IFloatingPointCalculator
{
    [OperationContract(Name = "AddInt")]
    new int Add( int a, int b );

    [OperationContract(Name = "AddDouble")]
    new double Add( double a, double b );
}

Si je fais ceci, alors WCF expose les deux méthodes au client, qui peut les appeler, et tout fonctionne réellement.

Cependant, "hériter des interfaces" de cette manière semble peu pratique. En particulier le site new int Add y new double Add . A proprement parler, new sur une méthode indique qu'il faut cacher une méthode sous-jacente, ce que je ne fais pas du tout. Je peux omettre le new mais ensuite je reçois des avertissements du compilateur qui se résument à "Je pense que je cache cette méthode, tu dois la renommer méthode ou mettre 'new' dessus".

Il s'agit donc d'une question en deux parties :

  1. Suis-je sur la bonne voie avec ma logique de "tout combiner en une seule interface", ou existe-t-il réellement un moyen d'exposer des "sous-services" ou des "services multiples liés" en utilisant WCF ?

  2. Si c'est ce qu'il faut faire, y a-t-il un meilleur moyen ?

Merci !

8voto

Orion Edwards Points 54939

Je viens de découvrir que l'on peut exposer plusieurs points de terminaison (chacun utilisant une interface différente) au même service, et qu'il suffit de générer UNE librairie proxy sur le client qui donne accès à tous ces points, ce qui résout entièrement mon problème.

4voto

casperOne Points 49736

Je dirais qu'en général, non. N'oubliez pas que vous avez affaire à une technologie d'application distribuée, et non à une technologie d'objet distribué, de sorte que des concepts tels que l'héritage ne s'appliquent pas.

En général, je ne suivrais pas cette voie, mais plutôt des contrats spécifiques qui représentent le regroupement logique des opérations que vous voulez exposer par le biais du point de terminaison.

3voto

EnocNRoll Points 2897

Je pense que ce que vous décrivez n'est pas vraiment une bonne pratique. Bien sûr, il est possible d'implémenter plus d'un contrat de service sur un type de service, puisqu'il s'agit simplement d'implémenter plusieurs interfaces.

WCF rend certainement possible le support de multiples points de terminaison qui communiquent en utilisant des URIs uniques et des contrats indépendants. Cependant, le fait que la classe ClientBase n'accepte qu'un seul type d'interface de contrat, par exemple, implique pratiquement que les classes proxy, même si elles sont stockées dans la même librairie, doivent toujours mettre en œuvre distinctement une seule interface de contrat.

Si vous parvenez à créer une seule définition de classe proxy, j'aimerais savoir comment vous avez réussi à le faire. Il est possible que je comprenne mal vos besoins. L'implémentation de différentes classes proxy vous donne la flexibilité ultime car les valeurs de OperationContractAtrribute comme IsInitiating et IsTerminating seront probablement différentes pour différents contrats. La combinaison des interfaces de deux contrats, comme dans votre exemple, peut modifier la façon dont vous attribuez les méthodes du contrat de service.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X