Design-Patterns-MVVM-Model-f1d7c05c

M-V-VM Devenez magicien

Depuis l'écriture de cet article en 2012, il à coulé de l'eau sous les ponts les lien vers des exemple de code sont devenus obsolète avec la disparition du CodePlex notamment.

Un article à jour sur ce sujet dans l'univers de Microsoft :

Prism: Patterns For Building Composite Applications With WPF | Microsoft Learn

Vous trouverez également cet exemple dans les All-In-One Code Framework :
Design Patterns - MVVM - Model View ViewModel Pattern-Part 2

Je suis en train de remonter dans l'histoire pour comprendre ce que le modèle M-V-VM est devenu aujourd'hui.

Etude de l'exemple MVVM-Model-f1d7c05c

Voici un des nombreux exemples de tentative de faire quelque chose avec MVVM.

On veux qu'un bouton "Save" ne soit enable que si les deux TextBox du formulaire ne sont pas vides. Pour cela on implemente une pauvre CustomerDelegateCommand qui dérive de ICommand

Pourquoi "Customer" ? Peut-être parce qu'en plus de CanExecute et Execute de l'interface ICommand, on implémente une propriété :

_isAutomaticRequeryDisabled

A quoi sert-elle ? A priori à enabler ou disabler le faite de tester le bouton "Save".

Bon ...

Ce que je voudrais faire

Je voudrais que le comportement du formulaire soit : Si je supprime tous les caractères de l'un des deux champs texte alors le bouton "Save" est désactivé.

26/12/2012
Je remarque que le bouton "Save" ne se disable pas si on vide une des TextBox, il faut également faire un TAB pour disabler ce bouton. Tient c'est curieux.

Je me demande, si en mettant
_isAutomaticRequeryDisabled à true dans l'init de la
saveCustomerCommand dans
\ViewModels\CustomerViewModel.cs
j'obtiens le fonctionnement que je désire :
Je voudrais que le bouton Save se disable si je vide la TextBox comment faire ?
_isAutomaticRequeryDisabled à true le bouton ne se disable plus du tout. En effet la CustomerDelegateCommand ne sert qu'à ça elle ajoute un gestionnaire d’évènement sur CanExecuteChanged pour permettre ou non de disabler le bouton.

Je regarde un autre exemple :
\\AllInOneSamples\Visual Studio 2010\VERY-Easy-MVVM-MVVMExtraLit-9a24e749\C#\MvvmExtraLite\
<Button
CommandParameter="{Binding IsChecked, ElementName=chkButtonCanExecute}" />

Mais il n'y a pas de Property IsEmpty pour une TextBox, je ne peux donc pas Binder le IsEnable de mon bouton "Save" sur cette propriété qui n'existe pas.

Me voilà bien embêté.

Autre idée : Créer un Objet TextBoxIsEmpty dérivée de TextBox et qui implémenterait la propriété IsEmpty cela me parait bien compliqué.

Autre idée : Ajouter une propriété du CustomerModel : IsSaveEnable qui testerait la longeur de mes TextBox pour pouvoir binder mon bouton "Save" sur cette propriété.

Problème : La StackPanel qui contient les deux champs texte et qui est bindée sur le Model ne contient pas le bouton "Save" :

<StackPanel Orientation="Vertical" Margin="4" Height="153"
                    DataContext="{Binding Path=CustomerModelObject, Mode=TwoWay}">

Solution

Dans l'autre exemple :
\\AllInOneSamples\Visual Studio 2010\VERY-Easy-MVVM-MVVMExtraLit-9a24e749\C#\MvvmExtraLite\

Qui met en oeuvre le design-pattern du Mediator pour échanger entre les deux ViewModels, les TextBox se tiennent au courant de changement de leurs contenus respectifs par l'intermédiaire de UpdateSourceTrigger=PropertyChanged

Un des miracles du modèle MVVM et qui se passe dans le Modèle est le RaisePropertyChanged qui lui aussi joue avec le PropertyChanged

D'où mon idée de la solution :

            <TextBox Width="250" Height="20"
                     Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}" />
            <TextBox Width="250" Height="20"
                     Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}" />

Et ça marche !

N'est-ce pas magique ?

Les sources ici

Silverlight v4.0 v5.0 Dashboard Installation

Dashboard project in Silverlight

Curieux toutes ces sociétés spécialisées dans les grands systèmes de traitement de l'information et qui maintenant développent des "Tableaux de Bords" (Dashboard). En général, elles ont développé des systèmes de traitement de données, des plateformes complexes à l'a fois dans le déploiement des solutions, la maintenance et le contrôle du système. Leurs clients demandent maintenant qu'elles développent des applications simples d'utilisation permettant de contrôler le bon déroulement des opérations sur leur plateforme installée. C'est comme cela que l'on voit fleurir le développement des Dashboards.

On rencontre nombre de Dashboard en Silverlight, le web permettant l'administration et le contrôle des plateformes à distance.

La principale remarque que je ferais, c'est pourquoi ces sociétés éditrices de logiciels n'ont pas intégré ce besoin au moment de la conception et le corollaire en est que le développement de ce type d'application est particulièrement complexe à posteriori.

Et une deuxième pour la route,  soit le Dashboard impacte peu sur le système d'information existant mais alors il ne rend compte que partiellement de l'exécution du système et ne permet que de faire peu de choses. Soit il devient une véritable pieuvre, il simisse partout et fini par impacter le système en production.

Silverlight Downloads and Installation

A l'heure actuelle, la dernière version de Silverlight étant la version 5.0 je pars sur l'installe de la v5.0.

Silverlight v5.0


Attention n'installez pas le SDK tout seul si vous l'intention d'installer les Tools : Silverlight 5 Tools for Visual Studio 2010.

Curieusement, elle installe la version 3.0 et la version 5.0

C:\Program Files\Silverlight\v3.0
C:\Program Files\Silverlight\v5.0

C:\Program Files\MSBuild\Microsoft\Silverlight\v3.0
C:\Program Files\MSBuild\Microsoft\Silverlight\v5.0

Hors le projet qui nous intéresse est développé en v4.0 !? Bon ...

Silverlight v4.0

http://www.microsoft.com/fr-fr/download/details.aspx?id=18149

En gros on installe tout ça :
  • Runtime Microsoft Silverlight 4 Developer
  • Kit de développement logiciel Microsoft Silverlight 4 SDK
  • Microsoft Silverlight 4 Tools pour Visual Studio 2010
  • Services RIA WCF V1.0 pour Silverlight 4
  • F# Runtime pour Silverlight 4
Configuration requise :
Systèmes d’exploitation pris en charge : Windows 7; Windows Vista; Windows XP Service Pack 3
Windows 7
Windows Vista Service Pack 2
Windows XP Service Pack 3

Composants Visual Studio requis :
Microsoft Visual Studio 2010 avec la fonctionnalité Visual Web Developer
Microsoft Visual Web Developer 2010 Express

Très bien, mais moi je travaille sous Windows 2003 Server R2 SP2 ...
Il me semble donc que sur cette plateforme, je ne puisse pas installer SL v4.0 et que je doive passer par  Silverlight v5.0 et encore ... en installant au préalable Visual Studio SP1 ...
Merci Silverlight ...

Silverlight pour Windows 2003 Server R2

Pour cette plateforme, il faut donc installer :

Microsoft Visual Studio 2010 Service Pack 1
http://www.microsoft.com/fr-fr/download/details.aspx?id=23691

Installation de Microsoft Visual Studio Service Pack 1
Le Visual Studio SP1 regarde les produits installé sur votre plateforme afin de les mettre à jour.

Microsoft® Silverlight® 5 Tools for Visual Studio® 2010 SP1
http://www.microsoft.com/en-us/download/details.aspx?id=28358

Installation Silverlight 5 Tools for Visual Studio 2010 SP1

A guide to create Enterprise Dashboard

C'est le projet qu'il nous intéresse de faire fonctionner, trouvé dans AllInOnSamples
A tutorial to create a sample enterprise dashboard using MVVM pattern.

Au passage, nul besoin de télécharger les composants Visifire car ils sont déjà dans le projet dans le répertoire :
Visual Studio 2010\A-guide-to-create-6ab135b2\C#\Silverlight Binaries

A-guide-to-create Enterprise Dashboard - Solution
A-guide-to-create Enterprise Dashboard - Exécution
Have fun.

Remarques :
- Composants graphiques :
C'est toujours la même question avec les composants graphiques : Lesquels choisir ... ?

Passer de Silverlight v4.0 à Silverlight v5.0

Lorsque vous ouvrez une solution dont un projet est en Silverlight 4.0, il sera grisé mais Visual vous permet alors d'éditer le fichier projet .csproj.

On l'a vu, dans AllInOneSamples beaucoup de projet Silverlight sont en v4.0, donc adaptation :
Dans le fichier du projet :
ProductAndSales.csproj
Remplacer :
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
Par :
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>

Supprimer les deux références aux DLL :
System.Windows.Controls.dll
System.Windows.Controls.Data.Input.dll
Qui sont en version v4.0 par les même références en version v5.0

Vous pouvez également modifier dans le fichier .csproj tous les 4.0 en 5.0

Sauvez, bouton droit sur le projet : Reload

Et le tour est joué.

Entityframework et Silverlight

Projet intéressant

Consuming ADO.NET Entity Framework from Silverlight
http://geekswithblogs.net/berthin/archive/2011/05/29/ado_net_entityframework_from_silverlight.aspx

On va vite se rendre compte que cette page manque sérieusement d'explications.

Silverlight stratégie inadaptée aux services SOAP

Lorsque l'on créé une application Silverlight qui utilise un WCF Service References à l'exécution on obtient un message d'un autre monde :

Une erreur s'est produite en tentant d'effectuer une demande à l'URI 'http://localhost:1365/ServiceSaleEntity.svc'. Ce problème peut être dû à une tentative d'accès à un service entre domaines sans qu'une stratégie entre domaines appropriée soit en place, ou une stratégie inadaptée aux services SOAP. Il est possible que vous soyez contraint de contacter le propriétaire du service pour publier un fichier de stratégie entre domaines et veiller à ce qu'il autorise l'envoi d'en-têtes HTTP SOAP. Cette erreur peut également être liée à l'utilisation de  types internes dans le proxy de service Web sans utiliser l'attribut InternalsVisibleToAttribute. 
Consultez l'exception interne pour plus de détails.

Et pourtant, Il suffit de cocher la case dans les propriétés du projet :
Onglet Silverlight
Case à cocher : Require elevated trust when running in-browser

Silverlight using Entity Framework through WCF Service References

Le sujet était assez intéressant pour que je réalise un projet :

VisualStudio 2010
Silverlight 5

WcfServiceSaleEntity
WCF Service Application
Embarque la BD Sale.mdf dans App_Data
Fournit le ModelEntity : ModelSaleEntity.edmx

SilverlightEntityFramework
Application Silverlight Utilise le Service References : ServiceSaleEntity fournit par WcfServiceSaleEntity

Download Sample : Sivlerlight Consuming Entity Framework

Binding : pourquoi a-ton l'impression de faire de la magie ?

La plus grosse difficulté du projet, devinez ? Je vous le donne en mille : le Binding
Mais pourquoi à t-on l'impression de faire de la magie avec ce fameux binding ?
A mon avis c'est parce que l'intellisense et les outils Visual Studio ne sont pas fait pour ça tout simplement.
Mais aussi, parce que, les données ne sont pas là !
using SilverlightEntityFramework.ServiceSaleEntity;
et
ServiceSaleEntityClient saleService = new ServiceSaleEntityClient();
n'y change rien
Pour écrire la ligne :
<sdk:DataGridTextColumn Binding="{Binding ProductQuantity}"
dans MainPage.xaml c'est démerdez-vous ! Et tous les outils proposés ne vous aident pas !
Silverlight Entity Framework
Bas on n'est pas pret de faire un CRUD !

Create Read Update Delete à travers les Objets de WCF Reference Services utilisé par Silverlight, il faudrait pouvoir faire un DataContext.SaveChanges() pour mettre à jour la BD à partir de EF. Ce n'est pas si difficile  mais ce n'est pas du RAD ... encore que ...

Silverlight notes astuces

Lancez une appli silverlight comme Startupproject :
Exception dans :

private void Application_Startup(object sender, StartupEventArgs e)
{
    WebContext.Current.Authentication.LoadUser(this.Application_UserLoaded, null);
    ...
}

Message :

Le modèle d'URI « file » fourni est non valide ; le modèle« http » était attendu.
Nom du paramètre : via

Perso, j'ai mis la ligne en commentaire dans le projet BookShelf.

Silverlight Installation Suite

Il me manque encore quelque chose, c'est curieux de s'apercevoir par exemple que dans le framework de base il n'existe pas de MenuItem. Et pourtant un Menu cela peut être utile ...

Impossible de trouver l'assembly : System.Windows.Controls.Toolkit

Téléchargement du  : Silverlight 5 Toolkit - December 2011
http://silverlight.codeplex.com/releases/view/78435

Lacement de l'intallation :
Installation du Silverlight Toolkit December 2011
Ce Toolkit met à jour les templates de Visual Studio 2010 :
Silverlight 5 ToolKit December 2011
Sur le disque dur :
Silverlight 5 ToolKit December 2011 sur le disque dur
Pour lire un peu de doc concernant ce ToolKit vous avez la page suivante sur votre disque dur :

C:\Program Files\Microsoft SDKs\Silverlight\v5.0\Toolkit\dec11\Welcome.htm

Silverlight Installation Error

Vous avez un souci pour installer Silverlight sur votre plateforme Windows 2003 Server et c'est normal car c'est un processus assez tortueux. D'abord le "Web Platforme installer" a planté sans rien signaler pour installé Silverlight. En suite vous avez installé MS Visual Web Developer 2010 Express et au moment de créer votre première application Silverlight, voici le résultat qu'affiche votre Visual Studio :

Erreur à la création d'un projet Silverlight avec Web Developer
Pas de problème vous cliquez sur le lien, et vous tenter d'installer Silverlight 5 :

Installation de Silverlight 5
Mais le processus s'arrête brusquement avec l'erreur suivante :

Impossible d'installer Silverlight
Et c'est parti pour un redémarrage ...
Une fois la machine redémarrer le processus d'installation se déroule correctement vous pouvez alors créer votre première application Silverlight mais ou moment de choisir 3, 4 ou 5 vous n'avez pas le choix de 5 alors que vous pensez avoir installer Silverlight 5 ...

Installation de Silverlight 3.0 et 4.0
Et effectivement le SDK Silverlight 5.0 n'est pas installé ... J'ai simplement installé le runtime ... Pour en terminer avec Silverlight 5.0 je vous conseille la lecture du post suivant Ici.

En me trompant d'installe j'obtiens l'erreur suivante :

Install Silverlight 5 Tools Error on 2010 SP1
Le Silverlight 5 Tools for Visual Studio 2010 SP1 est téléchargeable Ici.

Et sinon l'installation continue :
Installation du Silverlight 5 Tools for Visual Studio 2010 SP1
Et se termine par :

Silverlight 5 Tools for Visual Studio 2010 SP1
Et cette fois le SDK Silverlight 5.0 est bien installé :

Installation du SDK Silverlight 5.0 for Visual Studio 2010 SP1




MSMQueue Sample

Microsoft Message Queue

Dans une architecture logicielle moderne, un peu complexe, on va un moment donné chercher à faire des bus applicatifs c'est à dire des endroits du système où différentes briques logicielles (modules, pug-in, application tiers) peuvent s'interconnecter et échanger entre elles. Pour réaliser cette fonctionnalité pourquoi ne pas utiliser MSMQueue ? L'avantage c'est que les différents modules peuvent alors soit être installés sur la même machine soit être répartis sur des machines différentes.

Il faut noter que la fonction MessageQueue.Exists() ne fonctionne qu'en local ... oui sur une architecture répartie il faudra utiliser un autre mécanisme pour que les différentes briques vérifient les dialogues.

Pour démarrer voici donc un exemple d'applications console :

*** ConsoleApplication PushInto Queue
S'occupe de vérifier si la MSMQueue MessageQueue existe et sinon la créé.

*** ConsoleApplication ReadInto Queue
S'occupe de lire les messages dans la Queue.

L'objet MessageQueue de System.Messaging fournit un gestionnaire d'événement ReceiveCompleted qui vous permet de définir une call-back qui sera appelée lors de la réception d'un nouveau message.

Requirements :
Visual Studio 2010 Express Edition
MSMQueue Installed on your Windows Systemes or not ...

Download Sample : MSMQueue in C# .NET

A noter également : le message d'erreur qui survient si vous n'avez pas installé MSMQueue sur votre système, en effet c'est un composant système qui n'est pas installé par défaut. Il vous faudra l'installé dans les composants windows. C'est là que vous pourrez administrer vos Queues, les purger, les effacer, les créer.

MSMQ est un composant de Windows :
Sur Windows 7
Control Panel\Programs\Programs and Features - Turn Windows Features On or Off
Microsoft Message Queue (MSMQ) Server

Unit Testing using Mock

Comment utiliser le framework Unit Testing pour réaliser des tests unitaires ?

Pour commencer, peut être ici :
http://www.pgs-soft.com/mocking-with-moq.html

Le meilleur lien sur le sujet, à mon avis :
http://code.google.com/p/moq/wiki/QuickStart

Et sinon juste un peu de code :

// Création de l'objet Mocker
var mock = new Mock<IMonObjetAMocker>();
IMonObjetAMocker monObjet = mock.Object;

// Creer un comportement du mock
mock.Setup(o => o.FonctionDeMonObjet()).Returns(FonctionDeMonObjetMocker());

void FonctionDeMonObjetMocker()
{
    // Faire ce dont j'ai besoin pour le test
}

L'automatisation des tests unitaires nécessite la création d'interfaces car c'est à travers l'interface que l'on pourra définir en test le comportement de l'objet Mocker (ou remplacé pour le test).

Cet article est très succinct mais c'est la porte d'entrée dans l'univers de l'Unit Testing qui lui est extrêmement vaste...

To Be Continued

Base de données PostgreSQL

Astuce de l'editeur de requêtes SQL

Problème : Impossible d'ouvrir un fichier de script qui a été édité par un autre éditeur de fichiers, des caractères sont illisibles.

Une chose bien énervante lorsque l'on démarre avec Postgre que l'on édite des scripts avec un autre éditeur puis que l'on veux les jouer ou les modifier dans postgre c'est cette dialogue box : "Le fichier "source" n'a pas pu être ouvert car il contient des caractères qui ne peuvent pas être interprétés.

Solution : Ouvrir le fichier avec un éditeur capable de "Convertir en UTF8" comme Notepad++

Architecture SOA

Services Oriented Architecture (SOA) ou Architecture Orientée Services en français (AOS), c'est une architecture destinée à rassembler les grandes applications de l'entreprise dites applications composites en applications interopérables et réutilisables.

Les applications composites du système d'information de l'entreprise communiquent entre elles grâce au bus applicatif et communiquent avec les utilisateurs grâce au bus de services leur fournissant ainsi des "services".

Wikipédia - Architecture Orientée Services

Notions du SOA :
Annuaire des Services : on parle d'annuaire UDDI recommandé par le W3C. WSDL : métalangage XML de description du service

Exemples :
Cette architecture apparait de plus en plus souvent dans les spécifications des outils de développement des grands éditeurs car elle répond à la croissante de la complexité de ces projets informatiques.
Eclipse avec STP
Oracle avec BPEL
IBM
Mais j'ai aussi entendu parlé de SOA pour Visual Studio avec MEF et IoC

D'aucuns diront que le SOA n'est qu'un dessins alors des dessins en voici :

http://www.ibm.com/developerworks/library/ar-archtemp/
A metamodel for instantiating the SOA reference architecture for a given solution
Layers of the SOA reference architecture: Solution stack view
The middleware view of the SOA reference architecture

Layer 1 Operational layer
Layer 2 Service component layer
Layer 3 Services layer
Layer 4 Business process layer
Layer 5 Consumer layer
Layer 6 Integration layer
Layer 7 Quality of service layer
Layer 8 Information architecture and business intelligence layer
Layer 9 Governance layer
SOA (9 couches ci-dessus) est presque plus complexe avec autant de choses inutiles que le modèle OSI (modèle des piles de protocoles de télécommunication 7 couches) ... à bon entendeur. Comme toujours en informatique depuis 30 ans ces modèles doivent être adaptés à la réalité du projet à réaliser.


Architecture d'Application vs Architecture de Services
Architecture d'Application vs Architecture de Services

Elément de Services :

Composant de Service
Composant de Service
Architecture du système :


Le système
Le système

Il y a encore beaucoup à dire sur l'architecture SOA. Je reviendrai.

ASP.NET MVC

Développer une applications web avec une architecture MVC - Model View Controler

Le développement rapide du .NET Framework permet l'émergence de MVC et cela va très vite depuis ASP ou les applications web classiques en asp.net html .aspx et le constat qu'elles sont trop lentes (un post et c'est toutes la page qui revient de serveur). D'où l'émergence d'une architecture MVC intégrée au .NET Framework.

Comprendre la différence entre ASP.NET Web forms et APS.NET MVC, c'est ici :
http://msdn.microsoft.com/en-us/library/dd381619(v=vs.98)
Parce que les applications MVC ne maintiennent pas le ViewSate (état de la vue entre deux appels serveur) il ne faut pas utiliser les contrôles de type GridView, Repeater, et DataList.

Comprendre l'exécution d'une application ASP.NET MVC, c'est ici :
http://msdn.microsoft.com/en-us/library/dd381612(v=vs.98)

Razor ou Webforms ?

Peut-on utiliser les deux moteurs de rendu Razor ou WebForms ASP.NET dans une même page ?

http://www.cellenza.com/publications/introduction-a-razor-pour-asp-net-mvc/
Introduction à la syntaxe Razor pour ASP.NET MVC

La réponse est non !

Peut-on utiliser les deux moteurs de rendu Razor et WebForms ASP.NET dans un même projet ?

La réponse est Non, Oui, Peut-être mais cela n'est pas supporté. Quoi qu'il en soit voici quelques techniques :
Vous partez d'une ancienne application web .aspx et vous voulez introduire un peu de razor c'est à dire quelques vues en .cshtml, voici comment faire, ici :
http://www.mikesdotnetting.com/Article/162/Using-Web-Pages-Helpers-in-ASP.NET-Web-Forms

Autres techniques plus complexes, ici :
http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

La véritable solution est probablement dans MvcScaffold.

ASP.NET MVC 3

ASP.NET MVC 3 fournit une infrastructure MVC (Model-View-Controller) au-dessus du runtime ASP.NET 4.

Download
http://www.microsoft.com/en-us/download/details.aspx?id=1491
http://www.microsoft.com/fr-fr/download/details.aspx?id=1491
MVC 3 pour Visual Studio 2010

http://www.asp.net/mvc/mvc3
ASP.NET MVC 3 est un framework pour construire des applications Web évolutives, basées sur les standards en utilisant des modèles de conception (design partterns) bien établies et la puissance de ASP.NET et du .NET Framework.

Avec MVC 3 on passe au moteur de rendu Razor ...

Support de multiples moteurs de rendu ...
Avec l'arrivée de Razor on peut facilement imaginer que les autres moteurs de rendu son amenés à disparaitre.

MvcScaffolding

http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/
Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package
Permet lors de la création d'une classe de créer l'ensemble des formulaires permettant de réaliser un Create-Read-Update-Delete (CRUD).
Dans la Package Management Console taper la commande :
PM> Scaffold controler MaClass

Le lien vers le blog de Steven Anderson comporte 7 points ...

Moteur de rendu Razor

http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx
Introducing “Razor” – a new view engine for ASP.NET

http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx
ASP.NET MVC 3: New @model keyword in Razor

http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx
ASP.NET MVC 3: Layouts with Razor

http://www.asp.net/web-pages/overview/more-resources/asp-net-web-pages-api-reference
This page contains a list with brief examples of the most commonly used objects, properties, and methods for programming ASP.NET Web Pages with Razor syntax.
...

ASP.NET MVC 4

http://www.asp.net/whitepapers/mvc4-release-notes

http://wildermuth.com/2012/1/18/Modern_Web_Development_-_Part_1
Modern Web Devlopment, how to make Razor and HTML5 web application using Visual Studio
Suppression des JS Microsoft, utilisation de NuGet pour installer JQuery UI.
Ajouter un nouveau controller par bouton droit sur le répertoire Controllers de la solution puis Add puis New Controller.
Ajouter une vue en éditant le C# du  nouveau controller puis bouton Add View...

Entity Framework

Entity Framework une brique maintenant indispensable de l'ADO.NET.

http://msdn.microsoft.com/fr-fr/library/vstudio/bb399572.aspx
Page de référence MSDN ...

Résumé :

ADO (Accès aux données) permet de programmer à partir d'un modèle conceptuel plutôt qu'un shcéma relationel. Le modèle conceptuel permet de de créer des types avec héritage, des membres complexes et des relations entre les objets.

L'intégration de LINQ permet une validation par rapport au modèle conceptuel au moment de la compilation.

Entity Framework fait maintenant partie intégrante du .NET Framework ...

Pour installer Entity Framework vous aurez besoin de NuGet :

http://docs.nuget.org/
http://docs.nuget.org/docs/start-here/overview
http://docs.nuget.org/docs/start-here/installing-nuget
http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c
NuGet Package Manager - Download
A collection of tools to automate the process of downloading, installing, upgrading, configuring, and removing packages from a VS Project.

http://msdn.microsoft.com/fr-FR/data/ef
Entity Framework is Microsoft’s recommended data access technology for new applications

 Get it


http://msdn.microsoft.com/en-US/data/ee712907
Get started

http://msdn.microsoft.com/fr-fr/data/jj590134
Compréhension rapide d'EF, 4 cas ; création d'une nouvelle DataBase, à partir d'une DB existante, en créeant du code, en le faisant générer automatiquement par les outils autour d'Entity Framework.

http://msdn.microsoft.com/fr-fr/data/jj572367
Entity Framework Code First to an Existing Database
Utilisation de Entity Framework Power Tools

Entity Framework Power Tools
Preview of useful design-time features for DbContext. When right-clicking on a C# project, the following context menu function is supported: 1) Reverse Engineer Code First - Generates POCO classes, derived DbContext and Code First mapping for an existing database. When righ...

http://msdn.microsoft.com/fr-fr/data/jj591506
Entity Framework Database First
Utilisation de ADO.NET Datamodel
Update model from DB

http://msdn.microsoft.com/fr-fr/data/jj572366
Entity Framework Code First to a New Database
virtual object make lasy loading
Using : Managed NuGet Packages ... pour installer Entity Framework
Using : Package Managed Console et les commandes : Add-Migration, Update-Database

D'autres exemples sont présents en targettant le .NET Framework 4.5

Détails des codes et des différentes utilisation de Entity Framework :

Code First to a New Database

Code First to an Existing Database

Model First

Database First

Entity Framework et Visual Studio 2010 Express Edition

L'extension de Visual Studio NuGet.Tools.vsix ne veut pas s'installer avec une version Express de Visual Studio !

Donc on essaye de récupérer EntityFramework.dll depuis le site :

http://nuget.org/packages

C'est devenu impossible ! Merci NuGet !

Et pourtant, ce qu'il suffit de faire c'est de récupérer la DLL EntityFramework.dll ici :
ADO.NET Entity Framework 4.1

Une fois l'exécutable EntityFramework41.exe lancé la DLL se trouve installée dans :

C:\Program Files\Microsoft ADO.NET Entity Framework 4.1\Binaries\EntityFramework.dll

Vous n'avez plus qu'a y faire référence dans vos projets créés avec Expression Edition et le tour est joué.
Have fun.

Entity Framework Error in Domain Service Class

Contexte de l'erreur

J'ai crée une Application Business pour Silverlight 5.0.
J'ai importée la BD AdventureWorks dans le répertoire App_Data.
J'ai créé un ADO.NET Entity Data Model à partir de cette BD.
Je veux créer une Domaine Service Class et là, le champ Avalaible Context Class est vide, alors qu'il devrait me montrer quelque chose comme : AdventureWorks_DataEntities (Entity Framework)

Entity Framework Error in Domain Service Class

Solution

Une partie de la solution est Ici où bien .

Elle concerne Visual Studio 2012 et Entity Framework qui maintenant génère des objets "DbContext" alors que les WCF Ria Services utilisent des objets "ObjectContext".

Un autre souci, j'avais installé DevForce (Framework) qui soit disant simplifie l'ADO mais j'ai du le désinstaller.

Sans oublier de Régénérer le projet une fois l'ADO.NET Entity Data Model régénéré :

Entity Framework et WCF RIA Services Erreur Corrigée
Voilà je peux maintenant créer ma Domain Service Class.




C# Reflection - Réflexivité - PropertyDescriptorCollection

Vous pensez que la réflexivité c'est compliqué ? Voyons ce qu'est réellement la réflexivité. La réflexivité, c'est donner la possibilité de découvrir les champs et les valeurs des champs d'un objet sans avoir à les énumérer. Cela apporte une très grand flexibilité aux code.
Langage C#
Vous avez écris un programme qui utilise la réflexivité sur un objet si cet objet vient à être modifié que vous ajoutez ou supprimez un champ votre code fonctionnera toujours.

Exemple de réflexivité en C#

On a deux objets qui possèdent des champs identiques. Il s'agit, sans nommer chacun des champs des deux structures, de copier les valeurs des champs communs (qui ont le même nom) de l'une des structure dans l'autre.

Ainsi, si l'on vient à retirer ou a ajouter des champs, ce code restera toujours utilisables.

Le code suivant copie les valeurs des champs communs de detail dans current :

using System.ComponentModel;

private void FillCurrent(ClassStruct1 current, ClassStruct2 detail)
{
PropertyDescriptorCollection sources = TypeDescriptor.GetProperties(detail);
foreach (PropertyDescriptor src in sources)
{
PropertyDescriptor dest = TypeDescriptor.GetProperties(current).Find(src.Name, true);
dest.SetValue(current, src.GetValue(detail));
}
}

Tout simple non ?

Singleton Design Pattern

Le pattern singleton est l'un des pattern les mieux connu en ingénierie informatique. Une singleton est une classe qui ne permet qu'une seule instance d'elle même. Et pourtant, en lisant cet article, vous pourriez être surpris ...

Singleton design pattern
UML Class diagram Singleton

Avec un article général sur ce pattern :

http://csharpindepth.com/Articles/General/Singleton.aspx

Article traduit par Jérôme Lambert sur développez.com :

http://jlambert.developpez.com/tutoriels/dotnet/implementation-pattern-singleton-csharp/

Ce sujet permet d'aborder un certain nombre de problématiques pointues comme le "thread-safe", l'initialisation des variables statiques ... Qui sont des problématiques systèmes, à résoudre absolument si l'on veut développer une application.

Finalement, la solution 4 est :

"Sealed" c'est pour sceller la Class qu'une autre Class ne puisse pas en hériter...

C'est la seule écriture qui résout la problématique du Singleton en C# : 

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }
  // This constructor to tell C# compiler to do not
  // create default public constructor
  private Singleton()
  {
  }
   public static Singleton Instance
   {
       get
       {
           return instance;
       }
   }
}

Et voici un exemple de ce qu'il ne faut pas écrire :

// Bad code! Do not use!
public sealed class Singleton
{
    private static Singleton instance=null;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

C'est assez aberrant de constater combien d'encre à fait couler cette simple spécification de déclarer une variable unique pour tout le programme... mais les affres du C# sont impénétrables et insondables. C'est en pratiquant que l'on acquiert l'expérience nécessaire à l'écriture de "bons programmes".

N'hésitez pas à commenter, à liker...

Comment rendre mes Assemblies visibles depuis Visual Studio

On a vu dans le post précédent comment utiliser le GAC pour y ajouter des Assemblies et je pensais sincèrement qu'en mettant mon assembly dans le Global Assembly Cache (GAC), je le verrais facilement dans Visual Studio en faisant "Add Reference ..." et en choisissant l'onglet ".NET" mais il n'en est rien !

Mettre un assembly dans le GAC ne permet pas de le "voir" depuis Visual Studio et pourtant cela me serait bien utile. Je travaille en ce moment avec log4net et dans les exemples que je trouve sur Internet, la référence est toujours "cassée".

Dans mes recherches pour tenter de trouver comment faire, je tombe sur des pages plus ou moins farfelues dont l'une dans le MSDN que je trouve légèrement compliquée. Il faut chercher à la rubrique "To display an assembly in the Add Reference dialog box".

Voici ma technique pour utiliser facilement mes assemblies, ceux que j'ai envie d'utiliser souvent avec Visual Studio. Une fois l'assembly dans le GAC, vous poursuivez par l'ajout d'une clef de registre.

Ajout d'une clef de registre pour Visual Studio

Bref, je me créé un petit fichier : MyAssemblies.reg avec le contenu suivant :

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\VersionMinimum\AssemblyFoldersEx\MyAssemblies] @="E:\\Assemblies"

Car je souhaite mettre mes Assemblies sur mon disque E: dans le répertoire "Assemblies". Ensuite, je double clique sur le fichier .reg pour ajouter la clef de registre dans la base de registre :

Inscrire la clef de registre "AssemblyFoldersEx\MyAssemblies" dans la base de registre
Clef de registre créée correctement
Je retourne dans mon Visual Studio ma référence est toujours cassée :

Référence à la DLL log4net cassée
Mais je sais que si je clique dessus, la petit icône jaune "Attention" va disparaître comme par enchantement :
DLL log4net trouvée automatiquement dans E:\Assemblies
Voilà, la référence à "\\Assemblies\log4net.dll" est maintenant correctement renseignée dans mon projet.

Remarque :
La DLL log4net n'est toujours pas visible depuis l'un des onglets "Add Reference ..." mais bon ... nous avons au moins appris quelque chose. Il s'agit certainement d'un problème de rafraichissement.

Conclusion

Pour qu'un assembly soit plus facile à utiliser depuis Visual Studio, il faut les deux choses :

  • Que l'assembly soit dans le GAC
  • Que la clef de registre pour Visual Studio existe avec le répertoire des assemblies




Assemblies et le Global Assembly Cache (GAC)

Les assemblies prennent la forme d'exécutables .exe ou de libraires .dll (dynamic linked librairie). Des développeurs peuvent très bien fournir un ensemble de modules qui pourront être assemblés ensembles.
Visual Studio ne peut créer qu'un seul assembli. Pour lier ou créer plusieurs assemblies et le lier entre eux nous devons utiliser le compilateur csc.exe et l'assemblies linker al.exe en ligne de commandes.

Comment construire un assemblie multifichiers

Visualiser le contenu d'un assembly

On peut consulter le contenu d'un assemblie en utilisant l'outil ildasm.exe (MSIL Disassembler - MicroSoft Intermédiate Language) depuis la console de commande Visual Studio :

Lacement de Ildasm depuis la console de commande Visual Studio
Visualisation du contenu d'un assembly grâce à Ildasm

Utilser gacutil pour gérer les assemblies du Global Assembly Cache

Pour être inclus dans le GAC un assembly doit posséder un nommage fort (strong-name) qui garanti son unicité.

Un assembly du GAC possède les caractéristiques suivantes :
Il ne sera chargé en mémoire que s'il est requis, autrement dit le GAC est un moyen efficace de gérer les ressources d'un grand projet.
On peut obtenir programmatiquement des informations sur un assembly en utilisant la Réflection (moyen de découvrir les méthodes et les propriétés d'un objet que l'on ne connait pas).

Signer un assembly avec un nom fort

Ensuite, on utilise l'outil gacutil.exe fournit dans le SDK. Cet outil ne doit utilisé qu'en développement, en déploiement il faut utiliser le Windows Installer pour installer des assemblies dans le Cache.

La commande pour lister les assemblies du cache est :
>gacutil -l

Installer un assembly dans le cache
Retirer un assembly du cache

Manifest d'assembli

C'est un peu la signature de l'assembli, il contient son nom sa version, la liste des références à d'autres assemblies. Parce que les manifest d'assemblies contiennent toutes les informations nécessaires sur l'assembly parce qu'il n'est pas lié aux clefs de registre, cela réduit les conflits de .dll et rend les applications plus faciles à déployer.

Langage C#

Mots clefs, astuces et autres particularités du langage C#.

Mots clefs du C#

using

L'utilisation de l'instruction using doit être vue comme un pattern en C#, un objet présent dans une instruction using doit dérivée d'une interface IDisposable. Ce qui nous obligera lors de la conception de codes propres à systématiquement écrire une fonction Dispose de nos objets et à y placer le code nécessaire lors de la destruction de cet objet :

http://www.dotnetdojo.com/instruction-indispensable-en-csharp-using-idisposable/

Pour les objets qui implémente la fonction Dispose, l'appel à MyObject.Dispose() est automatique ce qui est finalement pratique.

http://msdn.microsoft.com/fr-fr/library/yh598w02(v=vs.80).aspx

Le pattern est moins clair mais avec ces deux articles, on comprendra que l'utilisation de ce pattern permet l'écriture de code propre en se posant systématiquement la question de la destruction d'un objet. Car il est toujours préférable de libérer aussi tôt que possible les ressources limitées comme les handles de fichiers ou les connexions réseaux.

accessibilité des membres d'une classe, d'un assembli

public : l'accès n'est pas restreint.
protected : l'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur.
internal : l'accès est limité à l'assembly actuel.
protected internal : l'accès est limité à l'assembly actuel ou aux types dérivés de la classe conteneur.
private : l'accès est limité au type conteneur.

http://msdn.microsoft.com/fr-fr/library/ba0a1yw2(v=vs.80).aspx

problème : une class possède comme niveau d’accessibilité par défaut le niveau private et cela pose un problème car parfois le code généré reste ainsi inaccessible.
solution : pensez à mettre la class générée en public si vous avez besoin de l'utiliser.

static

Un membre de type static appartient au type lui même plutôt qu'à une instance de la classe. On y accède en utilisant le nom du type et non le nom de l'instance.

Exemple : Imaginons que nous ayons besoin de compter le nombre d'employés d'une entreprise :
public class Employee
{
  public string id;
  public string name;

  private static long employeeCounter = 0;
  public static long NbEmployes 
  {
    get { return employeeCounter ; }
  }

  public Employee()
  {
      employeeCounter += 1;
  }

  public Employee(string name, string id)
  {
      this.name = name;
      this.id = id;
      employeeCounter += 1;
  }
}

static void Main()
{
  Employee e = new Employee("Tara Strahan", "AF643G");

  // Display the Number of Employees
  Console.WriteLine("New Number of Employees: {0}", Employee.NbEmployes);
}

out

Passage par référence d'une variable n'ayant pas besoin de valeur initiale car c'est une variable de "sortie".

Types Nullables C#

Créé pour travailler avec des bases de données lorsque la donnée n'a pas de valeur affectée.

Opérateur ??

Exemples :
int? c = null;

// d = c, unless c is null, in which case d = -1.
int d = c ?? -1;
int? e = null;
// d = c or e, unless c and e are both null, in which case d = -1.
d = c ?? e ?? -1;

Accueil

Bonjour à vous, si vous visitez cette page,

Je travaille depuis très longtemps en développement d'application Microsoft et j'ai suivi l'évolution des langages ayant commencé en langage C pour des systèmes embarqués. J'ai viré à l'objet avec C++ que je trouvais trop permissif. Un petit détour par Java pour étudier les langages objets à fond et enfin arriva le C#.

J'ai écris de nombreux articles sur ASP.NET :
http://www.sodevlog.fr/asp.net.blog/

Sur mon serveur dédié c'est un peu cher et difficile à maintenir ...
Maintenant je m'intéresse à "l'architecture logicielle" depuis plus de deux ans.

Je note ici des idées des articles sur le développement C#, WPF, Silverlight et DotNET de façon plus générale.

Si je raconte des bêtises ou que vous n'êtes pas d'accord avec ce qui est écris surtout, surtout n'hésitez pas à ajouter votre propre commentaire.

Retrouvez moi sur le réseau social viadéo