Translate This Page

Rechercher

./

moamoaBlog Technologique de Matthieu Nicolescu
.NET Architect & Developper
Me Contacter

8 juin 2008 7 08 /06 /juin /2008 13:35
L'un des intérêts d'exposer plusieurs contrats (ou interfaces) sur un service WCF est de notamment permettre de fournir des opérations différentes suivant les acteurs accédants au service. Prenons le diagramme de classe suivant :


Nous avons donc un service "TradeService" qui expose l'opération "GetOrder" permettant de récupérer un ordre aussi bien pour un manager q'un analyste, l'opération "CreateOrder" destinée aux analystes pour créer un ordre et l'opération "ValidateOrder" destinée aux managers pour valider un ordre.

Le faire d'exposer le service sous la forme de deux contrats nous permettra ainsi d'exposer le contrat "IAnalysteTradeService" en protocole tcp sur le port 8000 (acteurs internes à l'entreprise) et d'exposer le contrat "IManagerTradeService" en protocole http sur le port 80 (acteurs externes à l'entreprise). Voici la configuration WCF correspondant à ce cas de figure :

<system.serviceModel>
  <services
>
    <
service behaviorConfiguration="serviceBehavior" name="TradeSystem.Services.TradeService"
>

      <
endpoint address="ManagerTradeService" binding="basicHttpBinding" bindingConfiguration="" name="managerEndPoint" contract="TradeSystem.Interfaces.IManagerTradeService"
/>
      <
endpoint address="AnalystTradeSystem" binding="netTcpBinding" bindingConfiguration="" name="analystEndPoint" contract="TradeSystem.Interfaces.IAnalystTradeService" />

      <host>
        <
baseAddresses
>
          <
add baseAddress="http://localhost:80"
/>
          <
add baseAddress="net.tcp://localhost:9000"
/>
        </
baseAddresses
>
      </
host
>
    </
service
>
  </
services
>
</
system.serviceModel
>

L'un des problèmes de cette solution réside dans le fait où le client interroge les méta données du service, il récupéra aussi les opérations des deux acteurs (même si suivant le endpoint utilisé, il ne pourra utiliser que certaines de ces opérations). Pour éviter cela, le moyen est donc d'exposer non pas un service mais deux services.

Partager cet article
Repost0

commentaires

O
Merci pour l'astuce. Il y a une coquille dans le billet sur le port (8000 vs. 9000).Est-ce possible en WCF de ne pas utiliser les attributs (pour le service et ses méthodes), car cela pollue les classes, ce qui est dommage...obligé dans ce cas d'utiliser des DTO (catastrophe...) ?
Répondre