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 |
|
Paramètres |
Un nombre quelconque de paramètres |
Préfixe de nom |
Nom quelconque |
Attribut |
ou
Pour plus d'informations, consultez QueryAttribute. |
Exemple |
ou
|
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 |
ou
Pour plus d'informations, consultez UpdateAttribute. |
Exemple |
ou
|
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 |
ou
Pour plus d'informations, consultez InsertAttribute. |
Exemple |
ou
|
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 |
ou
Pour plus d'informations, consultez DeleteAttribute. |
Exemple |
ou
|
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 |
ou
Pour plus d'informations, consultez InvokeAttribute. |
Exemple |
ou
|
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 |
ou
Pour plus d'informations, consultez UpdateAttribute. |
Exemple |
ou
|
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.