Olá pessoal, tudo certo?

Depois de alguns testes com o novo CTP de Julho do .NET RIA Services e a versão final do Silverlight 3.0, notei algumas mudanças e comentários aqui são necessários.

Nesses posts abaixo, você tinha alguns exemplos com o .NET RIA Services CTP de Maio 2009 e Silverlight 3.0 ainda Beta, lembra deles?

Mais recursos do .NET RIA Services CTP Maio 2009
Ref.: http://blogs.msdn.com/wcamb/archive/2009/06/26/mais-recursos-do-net-ria-services-ctp-maio-2009.aspx

HelloWorld com o .NET RIA Services
Ref.: http://blogs.msdn.com/wcamb/archive/2009/06/24/helloworld-com-o-net-ria-services.aspx

As dlls a seguir foram mantidas no SDK do Silverlight:

  • System.Windows.Controls.dll
  • System.Windows.Controls.Data.dll
  • System.Windows.Ria.Controls.dll

Porém, a System.Windows.Controls.Data.DataForm.dll, que era usada para a adição de controles dataControls (como o DataPager) foi movida do Silverlight SDK para o Silverlight Toolkit.

Microsoft® Silverlight™ 3 Tools for Visual Studio 2008 SP1
Ref.: http://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&displaylang=en

Silverlight Toolkit - July 2009
Ref.: http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24246

Se você não havia encontrado o Data.DataForm a partir da versão final do SL3, essa era a razão. Uma lista completa de quebras e mudanças do SL2 para o SL3 é encontrada no link abaixo:

Ensuring That Your Silverlight 2 Applications Work with Silverlight 3
Ref.: http://msdn.microsoft.com/en-us/library/cc645049(VS.95).aspx

O .NET RIA Services também mudou e a partir da documentação, o primeiro exemplo é dado usando o Entity Framework para a geração do DomainContext, exportando as entidades mapeadas para o cliente Ria.

Algumas pessoas também me perguntaram sobre o DomainContext gerado pela classe proxy no lado cliente. Quando tentaram fazer o binding dos dados no controle DataGrid, por exemplo, tiveram dificuldade para encontrar o DomainContext ou mesmo fazer a associação do DataSource no controle.

Para isso, vale destacar a localização do DomainContext. Sempre que a documentação citá-lo, ele está criado no arquivo da pasta Generetad_Code, por exemplo, o arquivo “SilverlightApplication1.Web.g.cs”. Veja a figura abaixo, onde destaco o DomainContext criado:

image

O nome é que não ajuda :( quando você criar a classe DomainService, ela empresta o nome para o DomainContext no proxy cliente. Isso pode gerar a confusão!

A partir desse DomainContext, que no meu exemplo foi gerado a partir do EDMX do Entity Framework no lado servidor, podemos usar o seguinte mapa para binding de dados.

Arquivo no lado do cliente: MainPage.xaml

   1: <UserControl x:Class="SilverlightApplication1.MainPage"
   2:     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
   3:     xmlns:dataControls="clr-namespace:System.Windows.Controls.Data;assembly=System.Windows.Controls.Data.DataForm"
   4:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   5:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   6:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
   7:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   8:     mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
   9:   <Grid x:Name="LayoutRoot">
  10:         <data:DataGrid Name="TheDataGrid"></data:DataGrid>
  11:   </Grid>
  12: </UserControl>

Arquivo no lado do cliente: MainPage.xaml.cs

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Net;
   5: using System.Windows;
   6: using System.Windows.Controls;
   7: using System.Windows.Documents;
   8: using System.Windows.Input;
   9: using System.Windows.Media;
  10: using System.Windows.Media.Animation;
  11: using System.Windows.Shapes;
  12:  
  13: // Adicionar novos namespaces
  14: using SilverlightApplication1.Web;
  15: using System.Windows.Ria.Data;
  16:  
  17: namespace SilverlightApplication1
  18: {
  19:     public partial class MainPage : UserControl
  20:     {
  21:         // Adicionar o contexto do DomainServices1
  22:         private DomainService1 _ctxt = new DomainService1();
  23:  
  24:         public MainPage()
  25:         {
  26:             InitializeComponent();
  27:  
  28:             // Carregar as entidades deseajdas.
  29:             LoadOperation<Contacts> loadOp = this._ctxt.Load(this._ctxt.GetContactsQuery());
  30:  
  31:             this.TheDataGrid.ItemsSource = loadOp.Entities;
  32:         }
  33:     }
  34: }

No código acima, note o trecho onde fazemos o binding para o DataGrid colocado na página .XAML, veja:

image

O que eu fiz foi carregar os dados da entidade Contacts, que foi exportada pelo contexto, a partir do EDMX gerado para meu banco de dados. Para isso, usei o método GetContactsQuery() do contexto gerado. Para as outras entidades, também tenho os métodos de consulta, como GetAccountsQuery(), GetBusinessCustomersQuery(), GetCustomersQuery(), etc.

Recomendo a leitura e testes sobre os exemplos com o novo .NET RIA Services CTP de Julho. Ele parece mais simples e aos poucos, esse framework vai ganhando os contornos de uma boa solução para o middle tier de uma solução RIA.

Microsoft .NET RIA Services July 2009 Preview
http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&displaylang=en#filelist

Por enquanto é só! Até o próximo post :)

Waldemir.