Services de domaine

Les services de domaine sont des services Windows Communication Foundation (WCF) qui encapsulent la logique métier d'une application Services RIA WCF. Un service de domaine expose un ensemble d'opérations connexes sous la forme d'une couche de service. Lorsque vous définissez un service de domaine, vous spécifiez les opérations de données qui sont autorisées via le service de domaine.

Lorsque vous concevez un service de domaine, vous devez l'imaginer comme un ensemble de tâches associées que les utilisateurs effectueront dans votre application. En général, ce type de tâche concerne un petit groupe d'entités étroitement associées. Par exemple, dans une application de rapports de dépenses, vous pouvez exposer des entités pour les notes de frais, les éléments de lignes et les détails. Vous pouvez alors placer les entités associées aux effets à percevoir dans un service de domaine distinct de celles associées aux effets à payer.

Services de domaine et leurs sources de données

La classe DomainService est la classe de base pour toutes les classes qui servent de services de domaine. Pour créer un service de domaine qui crée une liaison avec un objet de données personnalisé, vous devez créer une classe qui dérive directement de DomainService. Mais si vous avez un service de domaine qui crée une liaison avec un modèle d'entité ADO.NET ou qui expose un LIEN à une base de données SQL, vous devez plutôt utiliser des classes abstraites spéciales qui dérivent de DomainService.

  • Pour créer un service de domaine qui crée une liaison avec un modèle d'entité ADO.NET, vous devez créer une classe qui dérive de LinqToEntitiesDomainService. Les Services RIA fournissent la classe LinqToEntitiesDomainService.

  • Si vous voulez créer un service de domaine qui expose des classes LINQ to SQL dans votre application, vous devez créer une classe qui dérive de LinqToSqlDomainService. Cette classe est fournie dans Kit de ressources des Services RIA. Si vous voulez créer un service de domaine qui expose des classes LINQ to SQL dans votre application à l'aide de cette classe, vous devez télécharger le kit de ressources des Services RIA .

Quand vous utilisez la boîte de dialogue Ajouter une nouvelle classe de service de domaine pour créer un service de domaine, le type de service de domaine créé est basé sur les entités que vous exposez.

Une classe de service de domaine doit être marquée avec l'attribut EnableClientAccessAttribute pour rendre le service disponible pour le projet client. L'attribut EnableClientAccessAttribute est appliqué automatiquement à un service de domaine lorsque vous activez la case à cocher Activer l'accès client dans la boîte de dialogue Ajouter une nouvelle classe de service de domaine. Quand l'attribut EnableClientAccessAttribute est appliqué à un service de domaine, les Services RIA génèrent les classes correspondantes pour le projet client. Par exemple, lorsque vous appliquez l'attribut EnableClientAccessAttribute à un service de domaine nommé HRService qui expose une entité nommée Employee, les Services RIA génèrent un contexte de domaine nommé HRContext dans le projet client et une version client de l'entité Employee.

WCF et services de domaine

Étant un service Windows Communication Foundation (WCF), le service de domaine repose sur des concepts WCF. Le service de domaine conserve les éléments suivants :

  • usage standard des services WCF ;

  • les constructions de modèles de programmation WCF existantes, telles que les contrats d'opération, les comportements d'opération et les comportements de service ;

  • les capacités de personnalisation WCF standard, telles que la configuration des liaisons, la configuration des comportements et l'infrastructure de gestion.

Le contexte de domaine communique avec le service de domaine Services RIA à l'aide de WCF ChannelFactory pour créer un canal et lui transmettre un contrat de service généré à partir du service de domaine.

Par défaut, seul le point de terminaison binaire est activé pour les services de domaine. Aucune configuration supplémentaire n'est exigée pour utiliser le point de terminaison binaire. Si vous voulez utiliser un autre point de terminaison (tel qu'OData, JSON, SOAP ou un hôte personnalisé), vous devez enregistrer une fabrique de points de terminaison dans le fichier Web.config comme indiqué ci-dessous :

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

L'espace de noms System.ServiceModel.DomainServices.Hosting contient les points de terminaison pris en charge dans les Services RIA . L'espace de noms Microsoft.ServiceModel.DomainServices.Hosting contient les points de terminaison pris en charge par le kit de ressources des Services RIA , tel que le JsonEndpointFactory montré dans l'exemple précédent. Pour créer un point de terminaison personnalisé, vous devez créer une classe qui dérive de la classe DomainServiceEndpointFactory et substituer la méthode CreateEndpoints.

Opérations de données

Vous ajoutez des méthodes à un service de domaine qui effectue l'opération de données que vous souhaitez exposer. Par exemple, vous pouvez ajouter des méthodes qui effectuent les opérations suivantes :

  • Query

  • Update

  • Insert

  • Delete

Vous pouvez aussi ajouter des opérations plus compliquées telles que :

  • Invoke : implémenter des opérations qui doivent être exécutées sans suivi ni exécution différée. Cette méthode ne s'utilise qu'avec des données non-entité, et uniquement lorsqu'il n'est pas possible d'utiliser à la place des opérations de requête, de mise à jour, d'insertion ou de suppression.

  • Named Update : implémenter des opérations personnalisées qui ne tombent pas dans la catégorie des opérations de modification simples.

Lorsque vous exposez un service de domaine, un objet EntitySet est généré dans le contexte de domaine avec des propriétés qui indiquent les opérations (insertion, mise à jour ou suppression) permises au client. La modification des données s'effectue en modifiant la collection d'entité, puis en appelant la méthode SubmitChanges.

Dans la plupart des scénarios, il est préférable d'utiliser des opérations de requête, et non des opérations d'appel, pour charger des données. Les méthodes de requête retournent un seul objet Entity, IQueryable<Entity> ou IEnumerable<Entity>. Les méthodes de requête font partie intégrante du modèle de données pris en charge par DomainService sur la couche intermédiaire et par DomainContext sur le client. L'infrastructure des Services RIA ne génère d'entité dans le projet client que pour les entités retournées par les méthodes de requête dans un objet DomainService.

Les opérations d'appel fournissent un mécanisme hors plage pour le retour des données non-entité et l'exécution d'opérations avec des effets secondaires. Pour plus d'informations sur les effets secondaires, voir la propriété HasSideEffects. Les opérations d'appel ne sont en général pas appropriées pour les méthodes de requête. Même quand une opération d'appel retourne une entité, l'entité n'est générée pour le projet client que si elle est retournée par une méthode de requête.

Conventions

Lorsque vous ajoutez des méthodes en vue d'effectuer ces opérations, la méthode doit correspondre à la signature attendue pour cette opération. En plus de correspondre à la signature, la méthode doit inclure un préfixe de nom qui correspond à la convention d'affectation des noms pour cette opération de données. Si le nom de la méthode ne commence pas par le préfixe attendu, vous devez appliquer l'attribut correspondant à cette opération. L'attribut est facultatif si le nom de l'opération correspond à la convention d'affectation des noms. L'utilisation de la convention d'affectation des noms garantit une meilleure cohérence aux développeurs.

Vous ne pouvez pas surcharger des méthodes qui sont des opérations de domaine. Vous devez spécifier un nom unique pour chaque méthode pouvant être appelée depuis le projet client. Toutes les méthodes qui représentent des opérations de service de domaine doivent être publiques. Les méthodes doivent utiliser des types sérialisables pour les paramètres et les types de retour.

Vous pouvez empêcher l'exposition d'une méthode en lui ajoutant l'attribut IgnoreAttribute.

Les tableaux suivants indiquent les signatures d'opérations de données.

Requête

Une méthode de requête doit retourner une instance unique d'une entité, ou un objet IEnumerable, ou encore IQueryable, où T est un type d'entité valide. Puisque les méthodes surchargées ne sont pas autorisées, vous devez fournir un nom unique pour chaque méthode qui prend des paramètres d'entrée différents (par exemple GetEmployees() et GetEmployeesByLastName(string lastname).

Le tableau suivant dresse la liste des valeurs de signature attendues pour une opération de requête.

Valeur de retour

IEnumerable<T>, IQueryable<T> ou entité

Paramètres

Un nombre quelconque de paramètres

Préfixe de nom

Nom quelconque

Attribut

[Query] (C#)

ou

<Query()> (Visual Basic)

Pour plus d'informations, consultez QueryAttribute.

Exemple

public IQueryable<Product> GetProducts() (C#)

ou

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

Update

Le tableau suivant dresse la liste des valeurs de signature attendues pour une opération de mise à jour.

Valeur de retour

Aucune

Paramètres

Entité

Préfixe de nom

Update, Change ou Modify

Attribut

[Update] (C#)

ou

<Update()> (Visual Basic)

Pour plus d'informations, consultez UpdateAttribute.

Exemple

public void UpdateProduct(Product product) (C#)

ou

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

Insert

Le tableau suivant dresse la liste des valeurs de signature attendues pour une opération d'insertion.

Valeur de retour

Aucune

Paramètres

Entité

Préfixe de nom

Insert, Add ou Create

Attribut

[Insert] (C#)

ou

<Insert()> (Visual Basic)

Pour plus d'informations, consultez InsertAttribute.

Exemple

public void InsertProduct(Product product) (C#)

ou

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

Supprimer

Le tableau suivant dresse la liste des valeurs de signature attendues pour une opération de suppression.

Valeur de retour

Aucune

Paramètres

Entité

Préfixe de nom

Delete ou Remove

Attribut

[Delete] (C#)

ou

<Delete()> (Visual Basic)

Pour plus d'informations, consultez DeleteAttribute.

Exemple

public void DeleteProduct(Product product) (C#)

ou

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

Invoke

Les opérations d'appel fournissent un mécanisme hors plage pour le retour des données non-entité et l'exécution d'opérations avec des effets secondaires. Pour plus d'informations sur les effets secondaires, voir la propriété HasSideEffects. Les opérations d'appel ne sont en général pas appropriées pour les méthodes de requête.

Le tableau suivant répertorie les valeurs de signature attendues pour une opération d'appel.

Valeur de retour

Any

Paramètres

Un nombre quelconque de paramètres

Préfixe de nom

Any

Attribut

[Invoke] (C#)

ou

<Invoke> (Visual Basic)

Pour plus d'informations, consultez InvokeAttribute.

Exemple

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

ou

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

Named Update

Le tableau suivant dresse la liste des valeurs de signature attendues pour une opération de mise à jour personnalisée.

Valeur de retour

Aucune

Paramètres

Entité

Nombre quelconque d'autres paramètres

Préfixe de nom

Tout nom ne commençant pas par les préfixes Insert, Update ou Delete

Attribut

[Update(UsingCustomMethod=true] (C#)

ou

<Update(UsingCustomMethod:=True)> (Visual Basic)

Pour plus d'informations, consultez UpdateAttribute.

Exemple

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

ou

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

Ajout d'une logique d'application à un service de domaine

Après avoir défini l'opération de données exposée, vous pouvez ajouter la logique d'application requise à la classe de service de domaine. Le code généré par l'Assistant ne vise qu'à vous aider à commencer l'écriture de la logique d'application. Vous pouvez ajouter la logique directement aux méthodes d'opération ou l'ajouter aux méthodes appelées depuis les méthodes d'opération. Vous pouvez ajouter des paramètres aux méthodes existantes, personnaliser la mise en œuvre de méthodes ou ajouter de nouvelles méthodes pour fournir les fonctionnalités nécessaires à votre application. Pour plus d'informations sur la façon d'implémenter la logique métier, consultez Procédure : Ajouter une logique métier au service de domaine.

Lorsque vous implémentez un service de domaine, vous devez considérer attentivement les problèmes de sécurité qu'entraîne l'exposition de données à travers un service. Pour plus d'informations sur la sécurité, consultez Sécurité des Services RIA WCF.

Voir aussi

Concepts

DomainContext et Opérations
Sécurité des Services RIA WCF