Microsoft .NET RIA Services CTP July 2009 : Algumas mudanças com o Silverlight 3 final

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.: https://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.: https://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.: https://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&displaylang=en

Silverlight Toolkit - July 2009
Ref.: https://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.: https://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="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    5:     xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    6:     xmlns:d="https://schemas.microsoft.com/expression/blend/2008" 
    7:     xmlns:mc="https://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
https://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&displaylang=en#filelist

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

Waldemir.