MVVM de Josh Smith

L'implémentation du modèle MVVM qu'en a fait Josh Smith se trouve autrement appelé dans le codeplex : MVVM Foundation

http://bubbleburst.codeplex.com/
Un projet de jeux avec des balles ou des bulles que l'on fait disparaître lorsque l'on clique sur des bulles de la même couleur. Utilise la DLL :  MvvmFoundation.Wpf.dll
et une autre DLL : Thriple.dll

http://mvvmfoundation.codeplex.com/
Le framework MVVM écris par Josh Smith

http://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-avoid-messy-propertychanged-event-handling/
Forum, discussion sur la façon de traiter proprement les événements PropertyChanged

Principes du MVVM de Josh Smith

Le modèle MVVM de Josh Smith repose sur la création de quatre classes :

ObservableObject : classe de base des ViewModel ou de tous types qui doit fournir des notifications de PropertyChange, implémente l'interface INotifyPropertyChanged. Cette classe peut se nommer à l'usage ViewModelBase.
protected void RaisePropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName); // Debug purpose

PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}

RelayCommand : Dérive de l'interface ICommand et permet d'implémenter les Commands
public class RelayCommand : ICommand
{
readonly Action _execute;
readonly Func<bool> _canExecute;

public RelayCommand(Action execute) : this(execute, null)
{
}

public RelayCommand(Action execute, Func<bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");

_execute = execute;
_canExecute = canExecute;
}

public void Execute(object parameter)
{
_execute();
}
}

public class RelayCommand<T> : ICommand
{
        public RelayCommand(Action<T> execute, Predicate<T> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");

            _execute = execute;
            _canExecute = canExecute;
        }
       ...
}

PropertyObserver : Une méthode standard pour gérer l'événement INotifyPropertyChanged.PropertyChanged des autres objets. Cette classe utilise des références faibles (weak references) et le pattern weak-event pour éviter les fuites de mémoire !
public class PropertyObserver<TPropertySource> : IWeakEventListener where TPropertySource : INotifyPropertyChanged
{
public PropertyObserver(TPropertySource propertySource)
{
if (propertySource == null)
throw new ArgumentNullException("propertySource");

_propertySourceRef = new WeakReference(propertySource);
_propertyNameToHandlerMap = new Dictionary<string, Action<TPropertySource>>();
}
       ...
}

Messenger : Mécanisme léger de passage de messages entre les différents ViewModel basé sur l'implémentation du pattern Mediator.
public class Messenger
{
public void Register(string message, Action callback)
{
this.Register(message, callback, null);
}

public void Register<T>(string message, Action<T> callback)
{
this.Register(message, callback, typeof(T));
}

void Register(string message, Delegate callback, Type parameterType)
{
if (String.IsNullOrEmpty(message))
throw new ArgumentException("'message' cannot be null or empty.");

if (callback == null)
throw new ArgumentNullException("callback");

this.VerifyParameterType(message, parameterType);

_messageToActionsMap.AddAction(message, callback.Target, callback.Method, parameterType);
}

public void NotifyColleagues(string message, object parameter)
{
if (String.IsNullOrEmpty(message))
throw new ArgumentException("'message' cannot be null or empty.");

Type registeredParameterType;
if (_messageToActionsMap.TryGetParameterType(message, out registeredParameterType))
{
if (registeredParameterType == null)
throw new TargetParameterCountException(string.Format("Cannot pass a parameter with message '{0}'. Registered action(s) expect no parameter.", message));
}

var actions = _messageToActionsMap.GetActions(message);
if (actions != null)
actions.ForEach(action => action.DynamicInvoke(parameter));
}

...
}

Utilisation de MVVM Foundation

TBC (To Be Continued)

Migration d'application Silverlight 3.0 et Prism Composite

Intéressant de voir ce que nous avons à faire pour migrer une application.

Il s'agit d'utiliser Silverlignt 5.0 et la dernière version de Prism et Visual Studio 2010 avec l'application téléchargée page suivante :

http://www.developmentalmadness.com/archive/2009/11/04/mvvm-with-prism-101-ndash-part-6-commands.aspx

Qui est développée avec
Visual Studio 2008
Prism Composite
et Silverlight 3.0

Requirements :
Visual Studio 2010
Prism 4.0
Silverlight 5.0

Migration de Visual Studio 2008 vers Visual Studio 2010

Ouverture de la solution avec Visual Studio 2010
Les projets Silverlight comme CodeCamp.Common sont grisés VS 2010 n'a pas pu les charger mais il nous permet d'éditer les fichiers .csproj

Dans le fichier projet on remplace :
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
Par
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
Pour le .NET Framework

Et :
<TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
Par :
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
Pour la version de Silverlight

Sauvegarde, puis bouton droit sur le projet Reload et la tour est joué.

Modifier les références, utiliser la dernière version de Prims

Modifier les référence aux anciennes librairies de Prims Composite
On supprime ces trois références pour les remplacer par une référence à :
\\Prism\Bin\Silverlight\Microsoft.Practices.Prism.dll

On Build le projet pour corriger les erreurs.
Dans :
\\CodeCamp\CodeCamp.Common\Events\MessageChangedEvent.cs
On remplace la directive Using :
using Microsoft.Practices.Composite.Presentation.Events;
Par :
using Microsoft.Practices.Prism.Events;
Dans :
\\CodeCamp\CodeCamp.Common\Utility\MockEventAggregator.cs
On remplace la directive Using :

using Microsoft.Practices.Composite.Events;
Par :
using Microsoft.Practices.Prism.Events;
Et :
public TEventType GetEvent<TEventType>() where TEventType : EventBase
Par :
public TEventType GetEvent<TEventType>() where TEventType : EventBase, new() // BRY

IEventAggregator se trouve dans le namespace :
using Microsoft.Practices.Prism.Events;

On termine ainsi la modification des référence aux nouvelles librairies de prims tout doucement en utilisant Visual Studio qui trouvera pour nous les directives Using à utiliser :
Visual Studio 2010 détecte les directives Using à utiliser
Pour le fichier :
\\CodeCamp\CodeCamp.Editor\EditorView.xaml
Il faut remplacer, l'ancienne référence :
    xmlns:cmd="clr-namespace:Microsoft.Practices.Prims.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"
Par :
xmlns:cmd="http://www.codeplex.com/prism"

Pour le fichier :
\\CodeCamp\CodeCamp.Shell\Bootstrapper.cs
On remplace :
Shell shell = Container.Resolve<Shell>();
Par :
Shell shell = Container.TryResolve<Shell>();

Pour résoudre les dernières erreurs on regardera aussi l'exemple :
\\Prism\Quickstarts\Modularity\Silverlight\ModularityWithUnity\ModularityWithUnity.Silverlight\QuickStartBootstrapper.cs

Et donc on remplace les directives using :
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.UnityExtensions;
Par :
using Microsoft.Practices.Prism.UnityExtensions;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Unity;

La fonction de crétation du catalogue :
protected override IModuleCatalog GetModuleCatalog()
Par la nouvelle :
        protected override IModuleCatalog CreateModuleCatalog()

Dans le fichier :
\\PrismSamples\CodeCamp\CodeCamp.Shell\Shell.xaml
On remplace :
    xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
Par :
xmlns:Regions="http://www.codeplex.com/prism"

Les références du projet CodeCamp.Shell sont ainsi :


Les références du projet CodeCamp.Shell

On peut enfin lancer l'exécution de la solution, et obtenir le résultat suivant :

Exécution de la solution CodeCamp
Download Sources Code
Code source de la solution ainsi modifiée, en comparant avec les sources de référence on se rend compte du travail effectué ... pour migrer cette solution.

Have fun !



Enterprise Library

Que reste t-il de l'Enterprise Library ?

Enterprise Library (EL publiée le 20/04/2010) est un composant ou plutôt un ensemble de composants, une série de blocs applicatifs, un socle, faisant partie des problématiques transverses de l'Architecture Logicielle.

Download Enterprise Library :

http://www.microsoft.com/en-us/download/details.aspx?id=15104

un vieux truc requirements :

Microsoft Windows® 7 Professional, Enterprise or Ultimate

Microsoft .NET Framework 4.0.

Hands-On Labs for Microsoft Enterprise Library 5.0 :

http://www.microsoft.com/en-us/download/details.aspx?id=6932 (lien mort !)

Objectifs de l'Enterprise Library

Un des principes fondamentaux du design des applications modernes est de réduire les dépendances et le couplage entre les composants et les objets. Enterprise Library vous permet d'atteindre ce but en mettant en oeuvre le pattern de DI (Dendency Injection).

Entreprise Library est désignée pour être extensible, vous pouvez très bien écrire votre propre composants (custom plug-in), modifier le code du corps et même créer vos propres nouveaux blocs.

Documentation :

http://entlib.codeplex.com/releases/view/43135 (lien mort !)

EntLib50.chm

http://entlib.codeplex.com/wikipage?title=EntLib5 (lien mort !)

Enterprise Library permet de gérer des préoccupations transverses.

Les blocs applicatifs

  • Caching. The Caching Application Block lets you incorporate a local cache in your applications that uses an in-memory cache and, optionally, a database or isolated storage backing store. The block provides all the functionality needed to retrieve, add, and remove cached data, and supports configurable expiration and scavenging policies. You can also extend it by creating your own pluggable providers or byusing third-party providers—for example, to support distributed caching and other features. Caching can provide considerable improvements in performance and efficiency in many application scenarios.
  • Credential Management. The Security Application Block lets you easily implement common authorization-related functionality, such as caching the user's authorization and authentication data and integrating with the Microsoft .NET Framework security features. 
  • Data Access. The Data Access Application Block simplifies many common data access tasks such as reading data for display, passing data through application layers, and submitting changed data back to the database system. Itincludes support for both stored procedures and in-line SQL, can expose the data as a sequence of objects for client-side querying, and provides access to the most frequently used features of ADO.NET in simple-to-use classes. 
  • Encryption. The Cryptography Application Block makes it easy to incorporate cryptographic functionality such as encrypting and decrypting data, creating a hash from data, and comparing hash values to verify that data has not been altered. Using thisblock can help you avoid common pitfalls when developing custom mechanisms that might introduce security vulnerabilities. 
  • Exception Handling. The Exception Handling Application Block lets you quickly and easily design and implement a consistent strategy for managing exceptions that occur in various architectural layers of your application. It can log exception information, hide sensitive information by replacing the original exception with another exception, and maintain contextual information for an exception by wrapping the original exception inside another exception. 
  • Logging. The Logging Application Block simplifies the implementation of common logging functions such as writing information to the Windows Event Log, an e-mail message, a database, Windows Message Queuing, a text file, a Windows Management Instrumentation (WMI) event, or a custom location. 
  • Validation. The Validation Application Block provides a range of features for implementing structured and easy-to-maintain validation mechanisms using attributes and rule sets, and integrating with most types of application interface technologies. 

Enterprise Libraries

Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.Unity.dll 
Microsoft.Practices.Unity.Interception.dll 
Microsoft.Practices.ServiceLocation.dll

Injection des dépendances

For Dependency Injection Enterprise Library use Unity.

Par défaut Enterprise Library utilise le mécanisme d'injection de Unity qui est fournit comme bloc applicatif de EL. Cependant, il est possible de configurer EL afin d'utiliser un autre container d'injection des dépendances qui serait fournit par configuration et qui proposerait une implémentation de l'interface IServiceLocatorinterface.

http://commonservicelocator.codeplex.com (lien mort !)

Pour plus d'informations, et pour une plongée dans l'enfer des Service Locator Adapter

MEF :
Microsoft.Practices.ServiceLocation.dll
public class MefServiceLocator : ServiceLocatorImplBase

Unity :
using Microsoft.Practices.ServiceLocation;
public class UnityServiceLocator : ServiceLocatorImplBase

ServiceLocator :
namespace Microsoft.Practices.ServiceLocation
{
    public abstract class ServiceLocatorImplBase : IServiceLocator, IServiceProvider
}

Intégration de Enterprise Library et de Prims ?

Et oui on sent bien qu'il va falloir faire "quelque chose" si on veut utiliser les deux "cadres d'application".

http://akashkava.com/blog/391/mef-vs-unity-in-composite-application-prism/ (lien mort !)

Comparaison de Unity et de MEF. Et là il faut surtout lire le premier commentaire de Jeremy Likness. Ce n'est pas gagné !

http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
Service Locator is an Anti-Pattern

http://blogs.msdn.com/b/bobbrum/archive/2008/11/23/prism-and-custom-enterprise-library-trace-listeners.aspx (lien mort !)

publié 24/11/2008 travailler avec Prism 1.0 and Enterprise Library 4.1

https://github.com/mefcontrib

Toujours là dans le GiHub c'est normal, le codeplex lui a disparu mais pas de développement après 2011.

MEF Contrib, mon dieu mais qu'est ce que c'est ?

Conclusion

Il ne reste plus rien de l'Enterprise Library et ce sentiment est accentué par la disparition du CodePlex mais les fonctionnalités de l'EL ont bien dues être absorbées quelque part

WCF RIA Services 1

Qu'est ce que WCF RIA Services ?

Vous souhaitez que votre Client Services RIA soit informé de la logique d'application qui réside sur le serveur, mais vous ne souhaitez pas développer et gérer cette logique à la fois sur la couche de présentation et sur la couche intermédiaire. WCF RIA Services est la solution.

Downloads :
Installation de la plateforme :
WCF RIA Services Toolkit
WCF RIA Services V1.0 SP2
Install pénible, devenv.exe met à genoux la machine pendant au moins un quart d'heure. Ensuite c'est ngen.exe qui prend la relève. Il faut patienter car la barre de progression est au max et fait penser à un problème d'installe. Mais cela finit par se terminer avec succès ...

Samples :
David Rousset
http://code.msdn.microsoft.com/How-to-open-a-WCF-RIA-171139fb

Après avoir récupéré le projet :
DemoKeynoteTechdaysEtape2
Avoir transformé le projet Silverlight 4 en Silverlight 5,
Cela ne fonctionne pas ... Une erreur d'un autre monde "Http client" attendu.

Je décide de refaire les fichiers générés du Domaine Service Class dans la partie Web :
Je supprime le deux fichiers :
FilmsService.cs
FilmsService.metadata.cs
et je recommence :
Add Domaine Service Class
FilmsService Domaine Service Class
L'application se met à tomber en marche :

Utilisation d'un Domaine Service Class en Silverlight
Étonnant non ...

Aller plus loin

C'est quoi le fichier : 
BookShelf.Web\Services\BooksDataService.svc

Dans l'application WPF (WpfBookShelf) bouton droit sur "Service References" clic sur "Add Service Reference ...". Après avoir cliqué sur "Discover" (in solution) on voit appraitre un choix de services présents dans la solution :
http://localhost:62207/Services/BooksDataService.svc

Lorsque l'on cherche à faire "Add New Item" dans BookShelf.Web\Services, pour ajouter ce type de fichier, l'icone de ce fichier ne correspond pas, cette icone correspondrait plutot à Web Service .asmx BooksDataService.svc est en fait un "WCF Data Service" et pour le lier à l'entities de l'Entity Framework, il y   a un peu de code à écrire :

WCF Data Service
Comparons les deux codes, celui généré automatiquement :

namespace BookShelf.Web.Services
{
    public class WcfDataService1 : DataService< /* TODO: put your data source class name here */ >
    {
        // 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.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }
    }
}

Et celui du projet BookShelf :

namespace BookShelf.Web.Services
{
    public class BooksDataService : DataService<BookShelf.Web.Models.BookClubEntities>
    {
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }
    }
}

Voilà maintenant une vision peut-être un peu plus claire des WCF RIA Services avec les deux types de class principales :
Domain Service Class directement reliée à l'ObjectContext du modèle Entity .edmx
et
WCF Data Service qui permet d'exposer un WCF Service utilisable par d'autres applications comme WPF ou Windows Phone.

Au passage on aura vu chez David Rousset :
Tous les moyens d'exposer un WCF RIA Service.

MVVM de Laurent Bugnion

http://www.galasoft.ch/
A propos de Laurent Bugnion et du MVVM Light Toolkit. Tout ce qu'il faut pour installer les DLL nécessaires au développement d'applications basées sur le modèle MVVM.

http://mvvmlight.codeplex.com/
Code source du MvvmLight Framework dans le CodePlex mais pour les télécharger vous devez être enregistré.

Petit tour rapide dans le Framework MVVM Light

On trouve des Solutions pour VS 2010 dans :
\\mvvmlight_0f4486b50609\GalaSoft.MvvmLight\GalaSoft.MvvmLight (NET4).sln

Command
  RelayCommand(Action execute)
  RelayCommand(Action execute, Func<bool> canExecute)
  RelayCommand(Action<T> execute)
  RelayCommand(Action<T> execute, Func<T, bool> canExecute)

Les commandes n'utilisent pas directement Action mais un objet du framework WeakAction
  public class WeakAction<T> : WeakAction, IExecuteWithObject

Messaging
  Design pattern mediator for communication beetween ViewModel
  GenericMessage<T> : MessageBase
  interface IMessenger
    void Register<TMessage>(object recipient, Action<TMessage> action, ...);
    void Send<TMessage>(TMessage message);
    void Unregister<TMessage>(object recipient);
  NotificationMessage : MessageBase

Parfois appelé Observer dans le sens ou l'on s'enregistre pour observer le comportement d'un objet ...

ObservableObject : INotifyPropertyChanged

ViewModelBase
  public abstract class ViewModelBase : ObservableObject, ICleanup

MvvmLight.Extras

Extension du framework MvvmLight de base.

Command
  EventToCommand : TriggerAction<DependencyObject>
  Il y a différentes versions : NET35, WPF, VS10, SL. Là encore la comparaison des versions donne une  indication des connaissances qu'il faut et de la complexité qu'il y a à écrire un tel code.

IoC
  Injection of controls, tient tient, on se rapproche encore de Prims
  using Microsoft.Practices.ServiceLocation;
  interface ISimpleIoc : IServiceLocator
  Laurent Bugnion prend le parti de créer son propre IOC Container basé sur un projet du codeplex Ici.

Compilations conditionnelles

#if SILVERLIGHT
#if NETFX_CORE
#if !WP71
#if !SL3
#if !WP71
#if !NETFX_CORE
#if !SILVERLIGHT
Cela donne une idée de la connaissance qu'il faut avoir et de la complexité qu'il y a à écrire un code pour ces différents environnements.

Blog

Le Blog de Laurent Bugnion est organiser de façon chronologique et se développe autour des différents évènements mondiaux auxquels il participe, c'est un peu difficile de s'y retrouver je trouve. Par exemple pour accéder aux exemples, il faut d'abord tomber sur l'article :

http://channel9.msdn.com/events/MIX/MIX11/OPN03
Deep dive in MVVM

Ensuite Laurent nous donne un lien vers son code source, on retourne dans son blog :

http://blog.galasoft.ch/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspx

Le preview :

http://blog.galasoft.ch/archive/2011/04/14/mvvm-light-v4-preview-3-bl16-mix11-edition-mvvmlight.aspx

Mais si on clique alors sur Home pour tenter de lire d'autre articles, on est alors un peu perdu ... Remarquez, c'est un peu normal puisque l'organisation de l'information y est chronologique.

Samples

Les exemples développé par Laurent Bugnion au cours de ses présentations :

Laurent Bugnion at MIX10


Codes sources

http://www.galasoft.ch/blogs-all/Resources/MIX10/MIX10-MVVM-Samples.zip

Laurent Bugnion at MIX11

http://blog.galasoft.ch/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspx

Codes sources

http://www.galasoft.ch/mvvm/resources/Samples/MIX11-DeepDiveMvvm-Samples.zip







C# Design Patterns

Les 23 patterns du GoF (Gang of Four) sont décrites sur le Site de  Do Factory.

Les trois grands types de patternes

Création - Creational

   Abstract Factory
Abstract Factory
Création de famille d'objets sans être obligé de spécifier leurs classes concrètement
  Singleton

Structure - Structural

  Adapter
Adapter
Adapter les interfaces pour faire travailler des composants ensemble
  Facade
  Proxy
Proxy
Gestion du contrôle d'accès

Comportement - Behavioral

  Observer

DP - Comportementale - l'Observer
On To Many dependances pour notifier une mise à jour.

Au sein du CodePlex : Tutorial: Common Design Patterns in C# 4.0 non c'est fini !


Exemple très intéressant avec du code C# et des modèle UML
Il manque malheureusement bon nombre de patterns

Cela ne va pas sans un peu de conception UML.

Et concernant le pattern, à lire : Singleton Design Pattern

Et si l'on compare avec la solution du Singleton décrite par Do Factory
Et bien on est pas sorti d'affaire ...

MVVM de Wilfried Woivré

Pour être complet il faut citer également :

Patrick Payet
Alexis Pera
Sébastien Courtois

La meilleur documentation que j'en trouve c'est :

Wilfried Woiré & Azure - Le design pattern - MVVM

Il semble que ce sample MVVM soit "absorbé" par Laurent Bugnion et son MvvmLight car Wilfried en fait de nombreuses références.

D'autre part cet article date de 2009. C'est un peu vieux.

Mise à jour Mais 2019
Je cherche simplement si ces liens sont encore valable et les retrouver quand c'est possible, Wilfried a quelque peu changé son site :

Archives
On trouve d'autres articles sur le MVVM et finalement une référence sur le projet Gala Soft c'est à la mode est migré vers le GitHub :

GitHub - laurent bugnion / mvvmlight









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...