Nouveautés Visual Studio 2010.

Sommaire

1.     introduction. 1

2.     Windows Forms. 1

2.1.     Local database (.sdf) 1

2.2.     Service base data base (.mdf) 2

2.3.     Data source from Service. 2

3.     WPF. 2

3.1.     Data grid. 2

3.2.     Binding. 2

4.     WCF. 2

4.1.     WCF Data Services. 2

4.1.1.   Présentation. 2

4.1.2.   Essayer. 3

4.1.3.   Tester avec le navigateur. 3

4.1.4.   Créer une appli de test. 4

4.2.     WCF Ria Services. 5

5.      ASP Net. 5

5.1.     Asp net dynamic Data entities web site. 5

5.2.     Dynamic data domain service. 5

6.      SilverLight 5

6.1.     Businnes Application Project. 5

7.      Ajax. 7

1.             introduction.

 

Ce document présente les nouveautés de Visual Studio 2010.

Bien que présentées ici, certaines fonctionnalités étaient déjà disponible en 2008, simplement 2010 présente de meilleurs assistants. De même les nouveautés présentées peuvent également concerner le framework 4 plutôt que Visual Studio.

 

2.             Windows Forms

2.1.                  Local database (.sdf)

 

Il s’agit d’une base de données locale destinée à être déployée avec le projet. Elle tourne sous Sql serveur compact. L’outil publish génère un kit qui assure l’installation automatique de sql serveur compact.

2.2.                  Service base data base (.mdf)

 

C’est une base de données classique de sql serveur. Simplement le fichier mdf est dans le projet. De plus l’assistant génère un data set. Il ne s’agit pas d’un service web.

2.3.                  Data source from Service.

 

Il est possible de définir une data source alimentée non pas par un SGBD mais par un service Web (ou WCF). En ce cas vous devez préalablement programmer le service et prévoir toutes les opérations.

Ensuite vous créer une nouvelle data source liée au service.

Vous pouvez ensuite intégrer des éléments de la data source à vos page. L’assistant génère les bindings mais vous devez programmer vous-même les requêtes au service, pour alimenter (et sauver) le binding source.

L’intérêt de l’assistant est limité.

3.             WPF

3.1.                  Data grid.

 

Elle est maintenant supportée.

3.2.                  Binding

 

Il existe un assistant pour le binding, pas convainquant pour un lien vers des objets dans le code behind.

Les options  NotifyOnValidationError="True" et ValidatesOnExceptions="True"

originellement disponibles avec Silverlight sont maintenant disponibles sur WPF, intéressant pour gérer les erreurs de saisie.

 

4.             WCF.

4.1.                  WCF Data Services.

4.1.1.                      Présentation.

 

Créer des web services ou des WCF pour une application, peut conduire au codage de nombreuses méthodes : getComptes, getCompteById, etc.

 

Le WCF Data Services propose d’automatiser l’exposition d’une base de données sous forme de service REST.

 

4.1.2.                      Essayer.

 

Sous visual studio créer un projet WCF

 

 

Voici un exemple très simple du code du service.

 

public class WcfDataServiceBanque : DataService<BanqueEntities>

    {

        // This method is called only once to initialize service-wide policies.

        public static void InitializeService(DataServiceConfiguration config)

        {

            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.

            // Examples:

            // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);

            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);

            config.SetEntitySetAccessRule("COMPTE", EntitySetRights.AllRead);

            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;

        }//fin init

    }// fin classe

 

En fait on se contente de déclarer les entités à exposer. Les entités sont explorées le plus simplement avec Entity Framework. Mais d'autres approches restent possibles.

4.1.3.                      Tester avec le navigateur.

 

Ce service peut être utilisé via l’Url :

 

//localhost:49295/WcfDataServiceBanque.svc/   Permet de lister les entités exposées.

 

http://localhost:49295/WcfDataServiceBanque.svc/COMPTE On obtient ainsi la liste de tous les comptes codée en XML :

 

Mais on peut aussi demander un seul compte par sa clef :

 

http://localhost:49295/WcfDataServiceBanque.svc/COMPTE(3)

 

Ou filtrer :

 

http://localhost:49295/WcfDataServiceBanque.svc/COMPTE?$filter=NumCompte gt 2

 

Bien noter qu’aucune méthode spécifique n’a été codée dans le service.

 

En résumé le service attend une Url, dont les paramètres définissent la requête à effectuer. Tout client capable de générer une telle URL et d’exploiter le Json ou le Xml retourné convient.

 

4.1.4.                      Créer une appli de test.

 

Il est possible de créer une application capable d’envoyer l’url et de récupérer et analyser le xml reçu.

Cela se fait, par exemple, en java script. C’est fastidieux.

 

Microsoft propose une bibliothèque pour aider :

 

using System.Data.Services.Client;

 

En combinant cette bibliothèque et LINQ, nous pouvons déporter sur le client le context LINQ.

Les requêtes seront bien exécutées par le service, mais nous aurons l’illusion de la localité de la base de données. Il faut donc dans le client :

 

 

 

·       Déclarer également l’url du service :

.

        private Uri svcUri = new Uri("http://localhost:49295/WcfDataServiceBanque.svc/");

 

·       Déclarer et instancier un context LINQ :

 

using ClientWCFdataService.ServiceReferenceBanque;

 

private BanqueEntities context;

context = new BanqueEntities(svcUri);

 

 

// Define a LINQ query

                  IQueryable<COMPTE> lesComptes = from cp in context.COMPTE select cp;

// afficher

                  this.compteItemsGrid.DataContext = lesComptes;

 

De fait le framework va transformer la requête Linq en l’URL convenable. Puis il exploitera le retour.

 

4.2.                  WCF Ria Services.

 

Voir plus loin dans silverlight : Business application project.

5.             ASP Net.

 

5.1.                  Asp net dynamic Data entities web site.

 

Table Name

COMPTE

DAB

VIREMENT

 

 

C’est un assistant qui permet une vue complète sur un ensemble de table. Il se fonde sur la notion de Dynamic Data qui méritera une présentation complète. Pour l’essentiel, il s’agit de pages et de contrôles  utilisateurs capables d’afficher des tables d’un Sgbd, mais le nom et la structure de la table ne sont définies que à l’appel de la page (via l’URL).

 

Ce projet est fondé sur un modèle entité ou un modèle Linq Sql. Vous indiquez la classe de ce modèle dans le global.asa.

5.2.                  Dynamic data domain service.

 

C’est sensiblement la même chose mais les données proviennent d’un service et non pas directement du modèle data entité.

Il faut donc créer le modèle entité puis un data service.

Reporter le nom de ce service dans le global.asa.

6.             SilverLight

6.1.                  Businnes Application Project.

 

Ce modèle de projet couple un projet Silverlight et un projet web pour l’héberger. Par défaut le projet silverlight est de type navigateur, mais il est possible de prendre un projet classique.

 

Dans le projet web :

 

Dans le projet silverlight, les données sont alors visibles comme data source:

Vous pouvez ensuite au choix.

 

Ajouter des éléments à votre page XAML (par exemple une grille) et les renseigner par code en appelant le service :

 

       // Executes when the user navigates to this page.

        protected override void OnNavigatedTo(NavigationEventArgs e)

        {

            //DomainServiceBanque est un classe du code généré

            BusinessApplicationBanque.Web.Services.DomainServiceBanque ctx = new DomainServiceBanque();

            this.gdComptes.ItemsSource = ctx.COMPTEs;

            ctx.Load(ctx.GetCOMPTEQuery());

        }

 

Ou utiliser l’assistant en tirant la data source dans le xaml, on obtient alors :

 

<UserControl

   

  x:Class="BusinessApplicationBanque2.MainPage"

  xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"

  xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"

  xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"

  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

  mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"

 

  xmlns:riaControls=

 "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"

  xmlns:my="clr-namespace:BusinessApplicationBanque2.Web.Services"

  xmlns:my1="clr-namespace:BusinessApplicationBanque2.Web.Models">

 

  <StackPanel >

     

      <TextBox Name="txtTitre" Text="Business application Banque" IsEnabled="False" FontSize="20" />

 

        <riaControls:DomainDataSource AutoLoad="True"

d:DesignData="{d:DesignInstance my1:COMPTE, CreateList=true}" Height="0"

LoadedData="cOMPTEDomainDataSource_LoadedData" Name="cOMPTEDomainDataSource" QueryName="GetCOMPTEQuery" Width="0">

            <riaControls:DomainDataSource.DomainContext>

                <my:DomainServiceBanque />

            </riaControls:DomainDataSource.DomainContext>

        </riaControls:DomainDataSource>

 

        <sdk:DataGrid AutoGenerateColumns="False" Height="200"

ItemsSource="{Binding ElementName=cOMPTEDomainDataSource, Path=Data}"

Name="cOMPTEDataGrid"

                      RowDetailsVisibilityMode="VisibleWhenSelected" Width="400">

 

            <sdk:DataGrid.Columns>

<sdk:DataGridTextColumn x:Name="adresseColumn" Binding="{Binding Path=Adresse}" Header="Adresse" Width="SizeToHeader" />

<sdk:DataGridTextColumn x:Name="codePostalColumn" Binding="{Binding Path=CodePostal}" Header="Code Postal" Width="SizeToHeader" />

<sdk:DataGridTextColumn x:Name="nomColumn" Binding="{Binding Path=Nom}" Header="Nom" Width="SizeToHeader" />

                <sdk:DataGridTextColumn x:Name="numCompteColumn"

 Binding="{Binding Path=NumCompte, Mode=OneWay}" Header="Num Compte" IsReadOnly="True" Width="SizeToHeader" />

<sdk:DataGridTextColumn x:Name="prenomColumn" Binding="{Binding Path=Prenom}" Header="Prenom" Width="SizeToHeader" />

<sdk:DataGridTextColumn x:Name="soldeColumn" Binding="{Binding Path=Solde}" Header="Solde" Width="SizeToHeader" />

<sdk:DataGridTextColumn x:Name="villeColumn" Binding="{Binding Path=Ville}" Header="Ville" Width="SizeToHeader" />

            </sdk:DataGrid.Columns>

 

        </sdk:DataGrid>

    </StackPanel>

</UserControl>

 

 

7.             Ajax.

 

7.1.                  Proxy manager.

 

Vous pouvez créer des services « Ajax enabled » en ajoutant un item de ce type. Vous pouvez au choix créer des services SOAP ou REST. Ici nous restons en SOAP.

 

Coté client les assistants Ajax vont nous aider :

 

Dans la page aspx :

 

On obtient un xaml de ce genre :

 

   <div>

        <h1>

        Illustrer l'appel d'un service en java script

        </h1>

        <asp:ScriptManager ID="ScriptManager1" runat="server">

        </asp:ScriptManager>

        <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">

            <Services>

                <asp:ServiceReference Path="http://localhost:49701/ServiceAjaxEnable/ServiceAjax.svc" />

            </Services>

        </asp:ScriptManagerProxy>

     <button id="btnHello" onclick="OnClickGreetings(); return false;">Greetings</button>

    </div>

 

    <div>

            <span id="Results"></span>

     </div>

 

Coder maintenant le code java script :

 

<script type="text/javascript">

        var helloWorldProxy;

 

        // Initializes global and proxy default variables.

        function pageLoad()

{

            // Instantiate the service proxy.

            // ServiceAjax est le nom du service.

           // C’est une classe java script générée qui implémente un proxy

           // cette classe est définie dans un fichier js connexe caché

         

            helloWorldProxy = new ServiceAjax();

 

            // Set the default call back functions.

            helloWorldProxy.set_defaultSucceededCallback(SucceededCallback);

            helloWorldProxy.set_defaultFailedCallback(FailedCallback);

          }

 

 

        // Processes the button click and calls

        // the service Greetings method. 

        function OnClickGreetings()

{

            var greetings = helloWorldProxy.Hello();

          }

 

        // Callback function that

        // processes the service return value.

        function SucceededCallback(result)

{

            var RsltElem = document.getElementById("Results");

            RsltElem.innerHTML = result;

          }

 

        // Callback function invoked when a call to

        // the  service methods fails.

        function FailedCallback(error, userContext, methodName)

{

            if (error !== null) {

                var RsltElem = document.getElementById("Results");

 

                RsltElem.innerHTML = "An error occurred: " + error.get_message();

            }

        }

    </script> 

8.             Jquery.

 

J query n’est pas liée à Dot net. C’est une bibliothèque qui « facilite » le codage du java script.

Elle permet d’accéder facilement aux éléments  du DOM.

 

Elle permet aussi de faciliter les appels au serveur dans le cadre des applications AJAX.

Le serveur peut être du php, du jsp, de aspx ou un service REST. Le codage JSON est le plus maniable, mais on peut aussi coder xml ou texte brut.