Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

ADO.NET Data Services: Change Interceptors con Visual Basic 2008

Nel post precedente abbiamo introdotto i Query Interceptors negli ADO.NET Data Services in Visual Basic 2008 e abbiamo visto come siano in grado di intercettare le richieste in lettura ricevute tramite HTTP. In questo post introduciamo i Change Interceptors, che si comportano in modo concettualmente analogo ma sono in grado di intercettare operazioni CRUD sulle entità e consentono allo sviluppatore di agire di conseguenza, sulla base di quale operazione è stata intercettata.

 

Riprendiamo l’ADO.NET Data Service che avevamo utilizzato proprio nel precedente post (nel quale troverete eventualmente i link per ricostruirlo) e supponiamo di voler intercettare l’aggiunta, l’aggiornamento e la rimozione di ordini dall’entità Orders e la situazione che vogliamo gestire è la seguente: 

  1. l’aggiunta e la modifica di un ordine richiedono che sia specificata la data dell’ordine stesso, pena un’eccezione e annullamento dell’operazione;
  2. la rimozione degli ordini è consentita solo laddove per l’ordine non sia specificata anche la data di consegna, pena un’eccezione e annullamento dell’operazione.

Queste due considerazioni si traducono nel seguente codice:

 

    'I Change Interceptor servono a intercettare le modifiche sulla sorgente dati

   

       <ChangeInterceptor("Orders")> Public Sub OnOrdersChange(ByVal DataSource As Orders, _

                                                            ByVal Action As UpdateOperations)

 

        If Action = UpdateOperations.Add OrElse Action = UpdateOperations.Change Then

 

            'Se verifico una condizione errata, sollevo un'eccezione

            If DataSource.OrderDate Is Nothing Then

                Throw New DataServiceException(400, "Order date cannot be null")

            End If

            'diversamente non faccio nulla e il servizio persisterà normalmente le modifiche

            'nell'origine dati.

 

        ElseIf Action = UpdateOperations.Delete Then

            'analogamente agisco sulla rimozione di oggetti

            If DataSource.ShippedDate IsNot Nothing Then

                Throw New DataServiceException(500, "You are not authorized to delete orders with full info")

            End If

 

        End If

    End Sub

 

Ho chiamato questo metodo OnOrdersChange, ma il nome non è vincolante (è comunque opportuno che sia “self-explanatory”), decorandolo con l’attributo ChangeInterceptor, il cui argomento è l’entità di cui vogliamo intercettare le richieste di operazioni CRUD. I Change Interceptors non restituiscono alcun tipo, per questo sono sempre delle Sub.

Questi speciali metodi ricevono due argomenti, il primo è l’istanza dell’entità sulla quale si sta tentando di eseguire l’operazione CRUD mentre il secondo (di tipo System.Data.Services.UpdateOperations) rappresenta il tipo di operazione CRUD richiesta ed è esposto da un’enumerazione.

 

Nel codice sopra esposto, stiamo intercettando le operazioni di aggiunta e modifica sollevando un’eccezione nel caso in cui nell’entità da modificare/aggiungere, ricevuta come argomento del metodo, la proprietà OrderDate sia uguale a Nothing. Nel caso in cui, invece, tutto sia come lo vogliamo, ci basta non fare nulla e il Framework proseguirà normalmente nell’operazione richiesta (quindi rieseguirà il SaveChanges).

 

Sulle operazioni di eliminazione si agisce in modo analogo. Nel codice sopra citato, viene consentita l’eliminazione di un’entità solo qualora la proprietà ShippedDate sia Nothing altrimenti viene sollevata un’eccezione.

 

A livello temporale, i Change Interceptors vengono gestiti quando dal client viene invocato il metodo SaveChanges del contesto. Lato server, l’intercettore viene gestito prima della persistenza dei dati nel db sottostante dopo aver verificato qual è il metodo chiamato dal client per eseguire l’operazione CRUD (quindi AddTo, UpdateObject o DeleteObject).

 

Facendo un esempio di codice, il seguente metodo istanzia un nuovo ordine, lo relaziona all’impiegato Nancy Davolio ma non ne imposta la proprietà OrderDate, che quindi è null:

 

    Private Sub CreateOrder()

        Dim newOrder As New Orders

 

        'Non assegno la OrderDate in modo da generare un'eccezione lato server.

        'Decommentare la riga per creare correttamente l'ordine

        With newOrder

            '.OrderDate = DateTime.Now

            .RequiredDate = DateTime.Today

            .ShipAddress = "Via Verdi"

            .ShipCity = "Cremona"

            .ShipCountry = "Italy"

            .ShipName = "VB new order"

            .ShippedDate = DateTime.Now

            'assegno il nuovo ordine all'impiegato Nancy Davolio

            'e devo utilizzare questa sintassi per poter utilizzare gli extension senza errori

            .Employees = NorthwindContext.Employees.Where(Function(emp) emp.LastName = "Davolio").First

        End With

 

        Try

            NorthwindContext.AddToOrders(newOrder)

            NorthwindContext.SaveChanges()

        Catch ex As Data.Services.Client.DataServiceRequestException

            Console.WriteLine(ex.InnerException.Message)

        Finally

            Console.ReadLine()

        End Try

 

    End Sub

 

 

Se ora vado ad eseguire questo codice, otterrò la seguente eccezione (il cui formato è Xml ATOM):

 

  

Ci basterà decommentare la riga di codice che assegna la proprietà OrderDate per vedere come invece il nuovo ordine venga creato e salvato correttamente. Gli intercettori hanno sicuramente una grande utilità, è comunque bene tener conto del fatto che probabilmente è più opportuno validare i dati (e comunicare l’esito della validazione) in modo più user friendly, magari attraverso l’interfaccia.

 

Ho comunque predisposto un progetto sorgente inerente i Query Interceptors e i Change Interceptors che potete scaricare da questo indirizzo dell’area Download di Visual Basic Tips & Tricks.

 

Alessandro

Print | posted on venerdì 23 gennaio 2009 01:00 | Filed Under [ Visual Basic WCF Data Services/WCF RIA Services/OData ]

Powered by:
Powered By Subtext Powered By ASP.NET