Procédure : Ajouter des transactions explicites à un service de domaine

Cette rubrique explique comment utiliser des transactions explicites dans votre service de domaine des Services RIA WCF pour garantir qu'un ensemble de modifications sera effectué de façon groupée. Lorsque vous appelez SubmitChanges à partir du client sur DomainContext, il appelle Submit sur le serveur. Il est ainsi possible d'incorporer des transactions en remplaçant la méthode Submit par l'implémentation de base et en l'enveloppant dans une étendue de transaction. Celle-ci, à son tour, appelle PersistChangeSet qui finalise toutes les opérations CUD (créer, mettre à jour et supprimer) qui ont été appelées.

Cette procédure sert uniquement à intégrer des transactions dans un service de domaine qui dérive directement de la classe DomainService, comme c'est le cas, par exemple, lors de l'utilisation de modèles de données définies POCO (objets XLR traditionnels). Lorsque le service de domaine est dérivé de LinqToEntitiesDomainService à l'aide d'Entity Framework, la transaction est gérée automatiquement.

La procédure décrite dans cette rubrique suppose la création au préalable d'une application Services RIA . Les procédures permettant de le faire peuvent être suivies dans la rubrique Procédure pas à pas : Création d'une solution de Services RIA.

Pour créer une transaction explicite

  1. Cliquez avec le bouton droit de la souris sur un projet serveur et sélectionnez l'option Ajouter une référence afin d'ouvrir la fenêtre Ajouter une référence. Dans l'onglet .NET, recherchez et sélectionnez l'assembly System.Transactions, puis cliquez sur OK.

  2. Dans le service de domaine, substituez la méthode Submit.

  3. Créez une étendue de transaction qui encapsule un appel à l'implémentation de base de la méthode Submit.

  4. Vérifiez la propriété HasError sur l'objet ChangeSet avant d'achever la transaction.

    L'exemple suivant montre une transaction explicite pour un service de domaine.

    <EnableClientAccess()>  _
    Public Class DomainService1
        Inherits DomainService
    
        Public Overrides Function Submit(ByVal changeSet As System.Web.DomainServices.ChangeSet) As Boolean
            Dim result As Boolean
    
            Using tx = New TransactionScope( _
                    TransactionScopeOption.Required, _
                    New TransactionOptions With {.IsolationLevel = IsolationLevel.ReadCommitted})
    
                result = MyBase.Submit(changeSet)
                If (Not Me.ChangeSet.HasError) Then
                    tx.Complete()
                End If
            End Using
            Return result
        End Function
    End Class
    
    [EnableClientAccess()]
    public class DomainService1 : DomainService
    {
        public override bool Submit(ChangeSet changeSet)
        {
            bool result = false;
    
            using (var tx = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })
                )
            {
                result = base.Submit(changeSet);
                if (!this.ChangeSet.HasError)
                {
                    tx.Complete();
                }
            }
    
            return result;
        }
    }