Con il collega Daniele ci siamo trovati a ragionare su cosa era meglio utilizzare per implementare un web service che permetta l’accesso ai dati ad un client Silverlight, vagliate le diverse ipotesi con i loro pro e contro, RIA Services, ADO.NET Data Services o semplice Web Service ci sarebbe piaciuto una soluzione un po ibrida.

Il punto a cui si vuole arrivare è poter utilizzare le Data Annotations di validazione direttamente nelle classi del proxy generato dall’Add Service Reference (o slsvcutil.exe).

Prima di tutto creiamo un nuovo progetto Silverlight ad esempio Albums, e nel progetto web creiamo un semplice servizio di login LoginServices con un solo metodo:

   1: [ServiceContract(Namespace = "")]
   2: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
   3: public class LoginService
   4: {
   5:     [OperationContract]
   6:     public bool CheckLogin(User user)
   7:     {
   8:         return true;
   9:     }
  10: }

Il punto che ci interessa è il parametro del metodo CheckLogin che è uno User così definito:

   1: public class User
   2: {
   3:     public String Login { get; set; }
   4:     public String Password { get; set; }
   5: }

a questo punto eseguiamo l’Add Service Reference nel progetto Silverlight e individuiamo la classe User auto generata

start reference.cs

Aggiungiamo un nuovo progetto alla solution di tipo Silverlight Class Library col nome ServiceReference, aggiungiamo una classe Referece.cs e ci copiamo dentro la classe User. Il progetto Albums avrà un reference alla nuova class library, il tutto dovrebbe avere questo aspetto:

Solution

Adesso andiamo ad aggiornare il Service References del progetto Albums modificando leggeremte le impostazioni:

How to Configure Service Reference Configure Service Reference

stiamo istruendo il proxy generator a non generare le classi che trova già implementate nella libreria ServiceReferences e in effetti il risultato finale è

Splitted reference.cs

un file Reference.cs (quello in alto) che verrà rigenerato ogni volta che aggiorniamo il web service e un file Reference.cs (quello in basso che contiene la sola classe User) che potremo modificare a nostro piacimento, ad esempio aggiungendo nella classe User le Data Annotations di validazione

   1: [System.Runtime.Serialization.DataMemberAttribute()]
   2: [Required (ErrorMessage = "Login is required")]
   3: public string Login
   4: {
   5:     get
   6:     {
   7:         return this.LoginField;
   8:     }
   9:     set
  10:     {
  11:         if ((object.ReferenceEquals(this.LoginField, value) != true))
  12:         {
  13:             this.LoginField = value;
  14:             this.RaisePropertyChanged("Login");
  15:         }
  16:     }
  17: }
  18:  
  19: [System.Runtime.Serialization.DataMemberAttribute()]
  20: [Required(ErrorMessage = "Password is required")]
  21: [StringLength(36, MinimumLength = 8, ErrorMessage = "Password must be between 8 and 36 characters")]
  22: public string Password
  23: {
  24:     get
  25:     {
  26:         return this.PasswordField;
  27:     }
  28:     set
  29:     {
  30:         if ((object.ReferenceEquals(this.PasswordField, value) != true))
  31:         {
  32:             this.PasswordField = value;
  33:             this.RaisePropertyChanged("Password");
  34:         }
  35:     }
  36: }

 

Il prossimo passo sarà quello di automatizzare anche la generazione della classe User tentando di mantenerla in linea con le mofiche del Web Service.

 

Il prossimo passo sarà nel prossimo post, spero a breve