Register Login

 

Welcome to the Coach Factor blog. Here you will find all of our ideas on software development. Subscribe at  http://blog.nventive.net.

# Monday, March 15, 2010

Les tweets de la semaine

 http://twitter.com/gpoune/statuses/10182612504 ah le monde déconnecté :) la consultation de ce document sur la gestion viewstate en ASP.NET est en soit un rappel des difficultés du monde web

 http://twitter.com/marcjohnson/statuses/10190244953 QCon a toujours eu une bonne réputation, on en reparle dans un instant

 http://twitter.com/TigerHasse/statuses/10361767261 les nouveaux jouets pour architectes dans Visual Studio 2010

La question Stackoverflow

 http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query On est toujours étonné par la puissance de Linq pour ces petites requêtes de la vie de tous les jours, on en serait où si on avait pas l’opérateur FirstOrDefault() ? La réponse la plus adaptée utilise un opérateur peu utilisé : le groupby.

Actualités Microsoft 

Après avoir lancé son offre commerciale autour des technologies “cloud” sous le nom Azure au mois de janvier dernier, Microsoft la complète maintenant avec une offre “serveur d’application”: Azure App Fabric. Cette dernière vient rejoindre Windows Azure (offre “computing” simple avec des rôles web et/ou services et un stockage non relationnel) et SQL Azure (base de données relationelle).

AppFabric se décompose en deux grandes fonctionnalités :

Un Bus de services pour permettre à des applications d’entreprises (souvent derrière des pare-feux) de communiquer via Azure :

diagramme ServiceBus

et un composant de gestion d’identité ou fédération et y associer des règles d’accès :

AccessControl

On trouvera aussi les prix associés dans ce billet. Un SDK est publié.

Actualités “Alt.NET”

QCon est une conférence (une édition à Londres et l’autre en Novembre aux USA) sur le développement informatique organisée par InfoQ, un site d’ínformations sur le monde de l’informatique de l’entreprise (un theserverside.com des années 2000 pour les plus anciens d’entre nous). Ce qui distingue QCon des autres conférences ce sont  la qualité des présentateurs et les sujets sur des technologies, méthodes innovante et/ou sur des questions d’architectures peu discutées autre part. On y trouve des classiques Robert C. Martin mais aussi des sessions sur des architecture atypiques comme Skype ou Facebook,  ou des technologies en particulier (comme .NET). La liste des tracks en elle-même est assez alléchante.

De l’autre côté

http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html

Vous avez tous vu dans votre flux de nouvelles sur Facebook ces messages d’amis qui ont eu telle ou telle récompense dans le jeu FarmVille. Luke Rajlich réponds ici à quelques questions sur la façon dont on rend disponible une application web utilisée par 75 millions d’utilisateurs. Le jeu a un ratio de lecture/écriture très différents d’une application web classique où les utilisateurs passent plus de temps à lire (site de journal par exemple) qu’à écrire (laisser un commentaire). On y apprend que l’utilisation de cache est primordiale (classique dans ce genre d’architecture mais ici ils doivent aussi mettre en cache les données de Facebook), de considére chaque composant (Facebook, les SGBD, le serveur de cache) comme un point de latence et de pouvoir les isoler en cas d’incident.

Un projet

Les bases de données relationelles ont la vie dure en ce moment (voir le mouvement NoSQL) mais est-ce dire que c’est au bénéfice des bases de données orientées objets ? Un de systèmes OODBMS qui connaît un certain succès est db4o de Versant. La version .NET fournie un plugin d’administration pour Visual Studio 2005 et 2008 :

la manager db4o dans visual studio

Le moteur peut s’utiliser en local (fichier) ou pour une connection à un serveur :

IObjectContainer db = 
Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), YapFileName);

IObjectContainer sera notre UnitOfWork pour dialoguer avec la base de données (il fournit ainsi les méthodes pour le Commit ou le RollBback) pour  :

- Insérer des données :

Pilot pilot1 = new Pilot("Michael Schumacher", 100);
db.Store(pilot1);

- Retrouver des données :

IList<Pilot> result = 
        db.Query<Pilot>(p => p.Name == "Michael Schumacher");

- Mettre à jour :

IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
var found = (Pilot)result.Next();
found.AddPoints(11);
db.Store(found);

Les classes sont des POCOS.

Un founisseur Linq existe (bien qu’il souffre de certaines limitations du fait qu’il traduit les requêtes en un langage interne, SODA) :

IEnumerable<Pilot> result = from Pilot p in db
                            where p.Name.StartsWith("Michael")
                            select p;

Pour gérer la profondeur en mise à jour et en lecture (opérations en cascade et lazy-loading) on doit modifier la configuration par défaut qui ne cascade pas les mises à jour sur les types référence :

IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);

En plus des propriétés de types primitifs (string, int etc.), les références sur Car seront mises à jours (Pilot par exemple). Pour la lecture la profondeur par défaut est de 5 niveau, on peut modifier ce paramétrage : c’est le concept d’Activation dans db4o. Pour rendre systématique ce processus vos classes doivent implémenter une interface (IActivatable) ou vous devez activer faire cette décoration au moment de la compilation via une tâche MSBuild ou en utilisant l’outil fourni par db4o.

Les concepts objet comme l’héritage sont bien sûr supportés. Il existe un langage bas niveau pour requêter (SODA) mais il est assez verbeux et repose beaucoup sur les chaînes de caractères. On utilisera plutôt Linq ou le langage natif de requête (en plus du requêtage par exemple déjà vu ) :

var result = db.Query<Pilot>(pilot => pilot.Points > 99
		                  && pilot.Points < 199
		                  || pilot.Name == "Rubens Barrichello");

 

Une version silverlight existe en beta. On pourra consulter le compte github de James Hicks pour avoir des exemples d’applications utilisant db40 : une abstraction de db4o à travers le concept de Session, une application avec une implémentation du pattern CQRS-Event Sourcing et l’utilisation de db4o avec NServiceBus.

Monday, March 15, 2010 2:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2] -
.net | Revue du Web
# Monday, February 22, 2010

Les tweets de la semaine

 http://twitter.com/cadred/statuses/9242655924 une revue du web .NET quotidienne, elle va très bien avec le café du matin

http://twitter.com/romainverdier/status/8922567409 la conversion de delegate, Func<T,bool> == Predicate<T> ?

http://www.alexatnet.com/content/net-memory-management-and-garbage-collector un petit rappel sur le Garbage collector en .NET

La question Stackoverflow

 http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no les bonnes pratiques officielles concernant les events en .NET peuvent être rébarbatives, cette question se concentre sur la classe représentant les arguments des évènements et sa version générique. 

Actualités Microsoft 

Windows Phone 7 Series a été annoncé, enfin les détails “grand public”, concernant les développements il faudra attendre un peu : on parle d’une version de Visual Studio gratuite et dédiée pour le début de l’été et un environnement de développement autour de Silverlight ou XNA pour le jeux. En attendant voici un graphique intéressant qui donne la répartition des profits de Microsoft selon les lignes de produits – on y voit bien l’effet de Windows 7 :

Actualités “Alt.NET”

On vous indiquait dans une édition précédente de la revue du web les présentations de SkillsMatter, celle de Udi Dahan sur Command Query Responsibility Segregation est maintenant en ligne : http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311

De l’autre côté

Hibernate, un des plus anciens ORM, continue son bonhomme de chemin et devient avec la version 3.5 conforme à la version 2 de la spécification JPA (un standard Java pour la persistance des données). Quelques nouveautés : Les annotations (équivalent des attributs en C#) sont incorporées dans le projet général, support de JDBC 4, la possibilité de décrire des schémas de chargement (Fetch Profiles). Cette dernière fonctionnalité est intéressante car si un ORM vous débarasse de l’écriture d’une couche d’accès aux données fastidieuse, le lazy loading a un effet pervers : on ne contrôle plus la granularité du graphe d’objets récupérés et on se retrouve vite avec des problèmes comme le Select N+1.

Un projet 

ELMAH est un projet qui permet de gérer l’audit des erreurs dans une applications ASP.NET. Les exceptions sont sauvegardées dans une base de données (Sql Server, Oracle, SQlite, un fichier XML).

La configuration consiste à ajouter un certain nombre de section pour paramétrer les différents aspects : logging, reporting, notifications etc. :

<sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>

Ainsi que les handler et le httpmodule dans les sections respectives :

<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
On configure le datastore, ici SQLite : 
<elmah>
   <errorLog type="Elmah.SQLiteErrorLog, Elmah" connectionStringName="Elmah.SQLite" />
</elmah>
<connectionStrings>
    <add name="Elmah.SQLite" connectionString="data source=~/App_Data/Elmah.SQLite.db" />
</connectionStrings>

On peut aussi specifier une notification par email (ou Twitter):

 <errorMail from="elmah@example.com"    
             to="admin@example.com"    
             cc="carboncopy@example.com"    
             subject="..."  
             async="true|false"  
             smtpPort="25"  
             smtpServer="smtp.example.com"    
             userName="johndoe"  
             password="secret" />  

La page permet de voir une liste des erreurs survenues et de voir le détail de la requête HTTP à l’origine du problème. On peut alors téleécharger le log et s’abonner à un flux RSS des erreurs :

copie d'écran de la page d'erreur

 

Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, February 22, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web

Les tweets de la semaine

 http://twitter.com/cadred/statuses/9242655924 une revue du web .NET quotidienne, elle va très bien avec le café du matin

http://twitter.com/romainverdier/status/8922567409 la conversion de delegate, Func<T,bool> == Predicate<T> ?

http://www.alexatnet.com/content/net-memory-management-and-garbage-collector un petit rappel sur le Garbage collector en .NET

La question Stackoverflow

 http://stackoverflow.com/questions/129453/net-eventhandlers-generic-or-no les bonnes pratiques officielles concernant les events en .NET peuvent être rébarbatives, cette question se concentre sur la classe représentant les arguments des évènements et sa version générique. 

Actualités Microsoft 

Windows Phone 7 Series a été annoncé, enfin les détails “grand publics”, concernant les développements il faudra attendre un peu : on parle d’une version de Visual Studio gratuite et dédiée pour le début de l’été et un environnement de développement autour de Silverlight ou XNA pour le jeux. En attendant voici un graphique intéressant qui donne la répartition des revenus de Microsoft selon les lignes de produits :

Actualités “Alt.NET”

On vous indiquait dans une édition précédente de la revue du web les présentations de SkillsMatter, celle de Udi Dahan sur Command Query Responsibility Segregation est maintenant en ligne : http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311

De l’autre côté

 

Un projet 

 Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, February 22, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Monday, February 08, 2010

Les tweets de la semaine

http://twitter.com/pm5links/statuses/8498715256 on a tous utilisé Reflector au moins une fois dans notre vie de développeur .NET. La version PRO payante de RedGate est prometteuse

http://www.lesnikowski.com/blog/index.php/testing-datetime-now/ utiliser DateTime,Now dans du code semble inoffensive  jusuqu’au moment où vous écrivez votre test

 http://twitter.com/Saucerdk/statuses/8670557833 Symbian est devenu open source il y a quleques temps, on peut maintenant développer en .NET pour ce système d’explotation. Un peu trop tard ?

La question Stackoverflow

http://stackoverflow.com/questions/1704487/algorithm-to-flatten-peak-usage-over-time Comment répartir de façon égale une quantité dans un contenant subdivisble, voici une réponse qui fait intervenir une classe que nous connaissons tous mais utilisons peu : HashTable.

Actualités Microsoft 

Microsoft a présenté ses résultats financiers en ce début 2010, et Windows 7 en plus d’être un système d’exploitation fini et réussi apporte un souffle financier signatificatif à l’éditeur. Comme l’explique ArsTechnica  les 60 millions de copies vendues lors ce trimestre sont sans doute pour beaucoup dans l’augmentation de 14% du chiffres d’affaires de Microsoft par rapport à l’année précèdente. Mais cet éditorial dans le New York Times d’un ancien vice-président de Microsoft sur les problèmes internes qui empêchent de faire emerger des produits innovants va sans doute un peu assombrir le tableau.

Actualités “Alt.NET”

 Sharp architecture est un projet qui se propose de faciliter le développement d’architecture en couches avec NHibernate. Commencé après un article sur codeproject (il y a presque 4 ans !), le projet est maintenant une application à part entière avec son site internet et un forum très actif.

On pourrait penser que ce ne sont que des bonnes pratiques d’architectes sans réelle application dans la vraie vie mais dans ce billet Billy McCafferty (créateur du projet) présente des applications en production qui utilisent ce “framework” dont Fancy Dress Outfitters http://www.fancydressoutfitters.co.uk/ . Ils lancent une autre application didactique cette fois-ci mais qui utilise les mêmes outils qu’une application réelle : http://who-can-help.me/ dont le code source est disponible.

De l’autre côté

On parle design cette semaine ! La signature email, c’est un peu les sites web personnels, on a tout vu : le gif animé, les polices de caractères de couleur fluo ou qui changent à chaque syllabe sans parler de celles qui font 20 lignes et s’entassent lors des échanges. Smahing Magazine nous présente une étude détaillée et nous livre quelques bons conseils.

Un projet 

Fluent Migrator est issu d’une amélioration de Migrator.NET un outil pour migrer des données entre différentes SGBD mais surtout entre différentes version d’un schéma. La gestion de configuration des bases de données n’est pas chose aisée il est agréable de voir des outils pour y remédier.

En Migrator.NET on utilise des attributs pour versionner des actions à exécuter contre un schéma :

[Migration(20080805151231)]
public class AddCustomerTable : Migration
{
        public override void Up()
        {
                Database.AddTable("Customer",
                          new Column("name", DbType.String, 50),
                          new Column("address", DbType.String, 100),
                          new Column("age", DbType.Int32, 100)
                         );
        }
        public override void Down()
        {
                Database.RemoveTable("Customer");
        }
}

L'attribut peut contenir un numéro version avec un entier ou un timestamp. Les actions possibles sont varíées : clés étrangères, du code SQL pour un SGBD particulier :

[Migration(5)]
public class AddForeignKeyToTheBookAuthor : Migration
{
        private const string FK_NAME = "FK_Book_Author";
        public override void Up()
        {
                Database.AddForeignKey(FK_NAME, "Book", "authorId", "Author", "id");
        }
        public override void Down()
        {
                Database.RemoveForeignKey(FK_NAME);
        }
}
Une application console, des tâches Nant et MSBuild existent pour exécuter et automatiser des migrations.

L’interface Fluent rajoutée par Sean Chambers simplifie l’API :

[Migration(1)]
public class TestCreateAndDropTableMigration: Migration
{
	public override void Up()
	{
		Create.Table("TestTable")
			.WithColumn("Id").AsInt32().NotNullable().PrimaryKey().Identity()
			.WithColumn("Name").AsString(255).NotNullable().WithDefaultValue("Anonymous");
		
		Create.Index("ix_Name").OnTable("TestTable2").OnColumn("Name").Ascending()
			.WithOptions().NonClustered();
		
		Create.ForeignKey("fk_TestTable2_TestTableId_TestTable_Id")
			.FromTable("TestTable2").ForeignColumn("TestTableId")
			.ToTable("TestTable").PrimaryColumn("Id");
		Insert.IntoTable("TestTable").Row(new { Name = "Test" });
	}
	public override void Down()
	{
		Delete.Table("TestTable2");
		Delete.Table("TestTable");
	}
}

Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, February 08, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Monday, February 01, 2010

Les tweets de la semaine

http://twitter.com/MrWaz/statuses/8198003333 WCF avec Mono sur Solaris, si si c’est possible

http://twitter.com/colinsurprenant/statuses/8203661366 un autre jour, un autre système de stockage clé-valeur

http://twitter.com/webAgencyFAIL une sorte de Daily What the Fuck pour web agencies.

La question Stackoverflow

 http://stackoverflow.com/questions/1204309/force-lazy-entity-to-load-real-instance Les framework modernes d’ORM gèrent  les associations polymorphiques de façon transparente pour le développeur mais il faut être conscient que cette magie peut vous jouer des tours (voir aussi le billet d’un des développeurs de NHIbernate sur ce sujet).

Actualités Microsoft 

vs2010perf

On dirait que l’équipe de développement de Visual Studio a bien travaillé sur les performances de la dernière version de l’éditeur de code. Dans un billet l’équipe nous mets l’eau à la bouche avec le résultat d’un sondage fait auprès des utilisateurs d’une version beta privée comportant les améliorations.  Cela ressemble à un feu vert pour la Release Candidate ?

 

 

 

 

Actualités “Alt.NET”

Voici une série de podcasts autour des projets open-source ou des méthodes agiles du monde .NET (Architecture MVC, F#, Command Query, etc)  et si vous habitez pas très loin de Londres vous pouvez assister à deux évènements gratuits sous la forme de discussion avec Udi Dahan (créateur de NServiceBus) et Ayende Rahien sur NHibernate.

De l’autre côté

Pendant que nous développons (et livrons) avec des technologies comme Silverlight, Flex ou ASP.NET MVC, HTML 5 fait son bonhomme de chemin (en octobre 2009 la dernière phase du processus - initié en 2007- de validation de la spécification a commencé). Mais ce chemin n’est pas si paisible que ça : la dernière contreverse concerne le nouvel élèment <video> qui permet de présenter un média sans passer par un plug-in propriétaire. Or les premières implémentations de YouTube ou Vimeo utilisent des codecs supportant H.264 (non libre) et d’autres Ogg comme Firefox. Il faudra donc sans doute founir plusieurs versions du même média. Les explications sur le site de Robert Nyman.

Un projet

 DejaVu se propose de fournir une bibliothèque légère gérant un système de commandes, leurs objets et l’enregistrement de l’état des données pour revenir en arrière (undo / redo).Un des principaux arguments pour l’utilisation de DTO en lieu et place d’objets métiers (POCO) dans la couche de présentation vient du souhait de ne pas les polluer avec les préoccupations de cette couche : notification de changement (la famause interface INotifyPropertyChanged), des validations de premier niveau, et la gestion des modifications. Cet article sur codeproject est une bonne introduction à cette bibliothèque. Bien qu’on puisse sans doute améliorer son utilisation, elle fait réfléchir sur le problème sous-jacent.

Voici un exemple où on explicite le début de l’enregistrement des modifications et leur commit ou rollback :

UndoRedoManager.Start("My Command"); // start point
data.Name = "Name1";
data.Weight = 33;
data.MyList.Add(other);
UndoRedoManager.Commit(); 
//ou
UndoRedoManager.Undo();

Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, February 01, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Monday, January 25, 2010

Les tweets de la semaine

 http://twitter.com/MichelSchep/statuses/7986002678 une vue d’ensemble des API du .NET Framework 4 avec DeepZoom

http://twitter.com/ReedCopsey/statuses/7959294663 Toujours .NET Framework 4, une série d’articles pour aborder le parallélisme

http://twitter.com/jschmiede/statuses/7912861843 On connaît TFS, Cruise Control et PSake, voici Rake pour .NET en vidéo

La question Stackoverflow

 http://stackoverflow.com/questions/2040924/best-way-to-communicate-between-net-1-1-and-net-3-5 Comment faire communiquer une application basée sur la version 1.1 du Framework avec une application qui utilise la version 3.5 ? Socket, Remoting, WebServices tout y passe.

Actualités Microsoft et Actualités “Alt.NET”

Nous essayons d’avoir le contenu le plus original possible mais il est difficile de passer sous silence ce billet d’Ian Cooper sur la communauté Alt.Net. Il est certain que la philosophie derrière ce mouvement (qui tourne autour de l’agilité, du TDD, des principes S.O.L.I.D. de développement) a fait du chemin dans la communauté .NET en général. Il est intéressant de voir les réactions / actions entre Microsoft et cette communauté dans divers domaines : ORM (Nhibernate, Entity- Framework, Subsonic etc.), IoC (Unity, StructureMap, Autofac) et le web: FubuMVC existerait-il si ASP.NET MVC n’avait pas été développé par Microsoft ? On espère que cette saine compétition continuera et s’étendra à d’autres domaines comme par exemple les ESB (on parle encore peu de AppFabric/Dublin, NServiceBus ou MassTransit).

De l’autre côté

 Google Collections est un projet comme il en existe beaucoup : compléter le framework Java dans un domaine bien particulier. Apache Commons est un autre exemple : client HTTP, Codecs, Emails etc… Il se sert du JDK 1.5 et des génériques pour apporter plus flexibilité, moins de friction dans l’usage des API de base. Par exemple faire un join

Joiner.on(", ").join(iterable);
Joiner.on(", ").skipNulls().join(iterable);
Joiner.on(", ").useForNull("<null>").join(iterable);

Voici un article concis qui montre les fonctionnalités de la bibliothèque.

Un projet

 HTML Agility Pack est une bibliothèque pour parser du code HTML, une tâche des plus ingrates qui puisse exister pour un développeur (après écrire une documentation peut-être). Les navigateurs pardonnant beaucoup il existe beaucoup de pages qui ne respectent pas les schémas sans parler des pages générées qui rendent le code des plus exotiques.

Ce projet qui a connu en fin d’année dernière un renouveau grâce à une série de patchs et maintenant un nouveau lead technique a encore rendu son utilisation plus agréable : requête de type XPath avec l’usage de Linq, Extraction facile du texte nettoyé des balises html etc.

var atts = _doc.DocumentNode.SelectNodes("//*[@background or @lowsrc or @src or @href]");
var hrefs = _doc.DocumentNode.SelectNodes("//a[@href]");
var nodes = from node in hrefs
            where node.Attributes["target"].Value == "_blank"
	    select node;

Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, January 25, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Monday, January 18, 2010

Les tweets de la semaine

http://twitter.com/csharp_tan/status/7857602895 une liste des frameworks MVVM (Model View VierwModel – un des patrons de conception pour la couche de présentation)

http://twitter.com/wanswins/status/7793053854 on vous parlait la semaine dernière de Script# un compilateur C# vers Javascript, il en existe d’autres comme sharpkit

http://twitter.com/dotnettv/statuses/7745427907 Event Driven architecture en vidéo

La question Stackoverflow

Nous allons parler d’une méta-question aujourd’hui : Quelle API doit avoir Stackoverflow ? Le projet a été annoncé sur le blog et déjà une liste de possibles applications est apparue. Une application web n’est une application web sans une API externe : quels formats supportés, le mode d’authentification, lecture seulement etc. ?

Actualités Microsoft

La saison des conférences va commencer dans quelques semaines : Mix 2010 où on devait parler de Visual Studio mais on entendra plus parler de Silverlight 4 et on espère de Internet Explorer 9 et Windows Mobile 7. Le lancement de Visual Studio sera annoncé le 12 avril lors de la conférence Devconnections Visual Studio 

Actualités “Alt.NET”

S’il y a bien un domaine où le monde .NET est actif c’est celui des frameworks de mapping objet-relationnel (et on dirait que cela se transpose dans le développement de frameworks de présentation WPF ou même du côté  web avec MVC). Voici un billet d’humour qui résume bien les relations entre eux. Un classique mais toujours efficace.

De l’autre côté

ToughtWorks édite Mingle qui est une application de gestion de projet supportant les méthodes agile. Ce dernier utilise une base de données : Mysql, Postgresql ou Oracle. L’éditeur a décidé d’abondonner le support de Mysql. C’est un SGBD très flexible : il y a une multitude d’autres moteurs de stockage que ISAM ou Innodb (livrés en standard) pour couvrir des besoins telle que les gros volumes. Mais il semblerait que certains se tournent vers des applications plus spécialisées (voir le mouvement Nosql (MongoDb, CouchDb etc ) ou plus orientées “entreprise”comme Postgresql.

Un projet

Pas un projet mais une liste de projets cette semaine : C# open source (base de données, PDF, CRM). Comme son l’indique ce site répertorie les projets open-source du monde .NET par catégorie. On pourra consulter aussi SharpToollbox qui est plus orienté outils de développement.

Auto-promotion

nVentive organise une série de bootcamps sur des sujets très variés comme WPF, TDD ou encore NHibernate.Tous ces ateliers sont orientés développement d’applications d’affaires et font une large place aux labs.

Voici une liste des formations et leur description plus complète.

Monday, January 18, 2010 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Tuesday, January 12, 2010

Les tweets de la semaine

http://twitter.com/penderi/statuses/7514754215 Souvent cité comme l’outil indispensable de Visual Studio, Resharper 5 est en beta et la dernière version semble prometteuse

http://twitter.com/dougcunha/status/7496302216 un aide-mémoire sur les principaux opérateurs Linq sous la forme de 101 exemples.

http://twitter.com/escobar5/statuses/7406606555 attention long article sur les fondamentaux de Linq

La question Stackoverflow

 http://stackoverflow.com/questions/2030636/c-read-only-calculated-properties-should-they-be-methods les propriétés calculées en .NET : doit-on coder une méthode ou une propriété en lecture seule ?

Actualités Microsoft

C’est peut-être une des nouvelles fonctionnalités de Silverlight 4 les moins discutées : l’incorporation de MEF dans le runtime. MEF est un framework open-source soutenu par Microsoft pour construire des applications extensibles en fournissant un système de plug-ins. Voici une série de vidéos pour aborder le nouveau couple MEF et Silverlight.

Actualités “Alt.NET”

Une des évolutions du TDD, BDD (Behaviour Driven Design) se propose de fournir une définition des tests en langage presque naturel et surtout très proche du domaine métier (c’est en cela qu’on présente le BDD comme étant du TDD + DDD). Cucumber est un framework BDD ruby mais qui supporte .NET et Java, Gojko Adzic en donne un exemple dans un billet.

De l’autre côté

Django est un framework web fondé sur le langage Python. Il a fait à Python ce que Ruby on Rails a fait à Ruby : démocratiser l’usage d’un langage pas très populaire. Ce développeur parle de son expérience en mettant en avant les fonctionnalités souvent citées : ORM, templating, interface d’administration. De plus le langage a connu un regain d’intérêt quand Google l’a choisi pour sa plate-forme cloud Google App Engine (depuis complétée avec Java).

Un projet

Script# est peu reconnu car c’est plus un outil qu’un Framework web classique comme ASP.NET MVC. Son développeur, Nikhil Kothari, est connu dans la communauté .NET pour fabriquer beaucoup de choses dans son “garage”. Script# est un compilateur C# vers Javascript pour être utilisé dans des applications web ou des gadgets Vista par exemple. L’une des applications de Microsoft qui l’utilise est Office Web, la version en ligne des applications bureautiques.

L’expérience de codage en C# :

scriplet

Le debug :

debug

Script# permet aussi la communication avec le serveur (JSON), incorpore une bibliothèque de composants graphiques de base comme la textbox mais aussi des textboxes avec des comportements auto-complétion ou watermaquée  etc.

Pour avoir une idée plus précise des possibilités et des limitations n’oubliez pas de parcourir le fichier PDF readme (40 pages) qui est une vraie documentation.

Tuesday, January 12, 2010 5:02:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Monday, December 14, 2009

Les tweets de la semaine

http://twitter.com/thierry_n/statuses/6581723672 : une nouvelle version de Mono, qui voit son offre commerciale prendre forme avec Mono Touch (développement pour l’iPhone), Mono Tools for Visual Studio et la plateforme serveur avec support (Suse Linux). Au passage le compilateur Mono devient aussi “C# 4.0 compatible”.

http://twitter.com/EdgarSanchez/statuses/6566426910 on parlait la semaine dernière de GWT, Volta, voici un produit open source commercial, SharpKit, qui permet de travailler en C# et compiler vers Javascript et vice versa.

La question Stackoverflow

 http://stackoverflow.com/questions/1681546/custom-wpf-control-dependency-property-not-binding-to-external-dp/1681624#1681624 Les “dependency properties” de WPF sont un des aspects les plus puissants du framework mais aussi un des plus difficiles à appréhender. Ici un exemple qui met en lumière l’importance des metadata associées aux DP.

Actualités Microsoft

Bien que certains pensent qu’une beta 3 ou une RC pour Visual Studio 2010 serait la bienvenue, la date de sortie (22 mars 2010) approche (moins de 100 jours maintenant). Dans cet article, Somasegar présente les nouveautés autour du développement d’add-in pour Visual Studio :

  • un SDK de 10 MB au lieu de 100 MB (= documentation en ligne) 
  • WPF comme framework de base
  • facilité d’extension autour de l’éditeur
  • un site renouvelé pour découvrir les extensions existantes

On pourra consulter aussi les nombreuses vidéos issues de la conférence “Development Tools Ecosystem”

Actualités “Alt.NET”

DDDFrance est un site francophone qui propose des ressources autour du Domain Drivern Design en français. Par exemple le livre DDD Quickly a été traduit : DDD vite fait.

Au passage, en suivant les principes du DDD dont l’utilisation au plus proche du langage du domaine métier, doit-on coder en anglais ou dans sa langue maternelle ?

De l’autre côté

VirtualBox est une application de virtualisation rachetée par SUN il y a maintenant un peu plus d’un an. La version 3.1 sortie fin novembre apporte des fonctionnalités telle que la migration “live’” d’une instance d’un hôte à un autre ou encore la restauration à partir d’un snapshot (arbitraire et non le dernier). Un projet communautaire fournit une console web pour administrer les machines virtuelles.

Un projet

StatLight.logo.home Statlight est un framework de tests automatisés pour Silverlight. Vous pouvez le penser un peu comme le Nunit de Silverlight. Dans la définition de xUnit et du TDD en général il faut que l’outil fournisse un moyen de :

 

  • définir les tests (attributs)
  • les exécuter
  • vérifier les résultats (méthodes d’assertions)
  • et les assembler en suite

Il faut d’abord se procurer le template de projet de tests unitaires pour Silverlight et le code source du framework de test unitaires (on le trouvera dans le sous-répertoire source code du toolkit : C:\Program Files (x86)\Microsoft SDKs\Silverlight\v3.0\Toolkit\Jul09\Source par exemple, extraire les dlls du répertoires binaries du dossier compressé). Vous devez arriver à cette structure

setup

Voici un test sur l’interface :

[TestClass]
public class Test : SilverlightTest
{
  private MainPage sut;
 [TestInitialize]
 public void Setup()
 {
    sut = new MainPage();
    //pour nettoyer les pages entre chaque TU
    this.TestPanel.Children.Add(sut);
 }
 [TestMethod]
 public void TestButton()
 {
    Assert.AreEqual(300, sut.Width);
    //no automation
    //visible with the [assembly: 
    //InternalsVisibleTo("MySLApplication.Tests")] 
    sut.Button_Click(this, null);
    Assert.AreEqual(Visibility.Visible, sut.childrenPanel.Visibility);
 }
}

Le changement de visibilité sur les contrôles et l’assembly vient du manque d’automation dans le Framework de test. Quand vous lancez le test une page apparaît avec les résultats :

resultat du test

Statlight permet d’automatiser cette démarche et est compatible avec TeamCity ou MSBuild par exemple. Ici on ajoute l’appel à l’outil dans un post-build (à exécuter avec un compte admnistrateur) :

C:\StatLight.v0.9\StatLight.exe -x='C:/Projects/MySLApplication.Tests/Bin/Debug/MySLApplication.Tests.xap"

résultat du test dans VS

La version de Visual Studio 2010 de Web Testing devrait être compatible Silverlight mais en attendant et/ou vous êtes sur une plateforme moins récente, StatLight est l’outil à évaluer.

Monday, December 14, 2009 5:26:07 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Tuesday, December 08, 2009

Les tweets de la semaine

 http://twitter.com/sbohlen/statuses/6236293827 les vidéos de la NotAtPdc sont en lignes.

http://twitter.com/programmingjoy/status/6296011683 Mono everywhere ? Un projet qui le rend disponible pour Android.

http://twitter.com/thbonk/status/6235070045 Windows Mobile n’a pas peut-être pas l’interface utilisateur qu’il mérite mais il a tous les atouts d’un système d’entreprise dont la présence d’un système de messaging comme MSMQ

La question Stackoverflow

 http://stackoverflow.com/questions/1855211/how-to-store-several-states-in-one-variable on connaît tous les énumérations mais leur utilisation en tant que flag (combinaison de plusieurs valeurs) est moins évidente même si souvent rencontrée dans le Framework lui-même.

Actualités Microsoft

Une des nouveautés du .NET Framework 4 sont les API autour du parallélisme. Afin de profiter des processeurs à cœurs multiples Microsoft ajoute des classes de base pour simplifier le développement de traitements en parallèle. On a beaucoup entendu parler de PLinq qui permet d’appliquer des traitements parallélisés à des ensembles d’objets. Task Parallel Library (TPL) est moins connue, un article au format PDF permet de découvrir les tâches parent-enfant, leur utilisation et leur debugging.

Actualités “Alt.NET”

Un nouveau site qui dépasse le monde .NET : http://www.algorithmatic.com/browse pour apprendre, découvrir et contribuer à un répertoire d’algorithmes, le site est en ASP.NET MVC et l’éditeur de code en Silverlight.

De l’autre côté

La spécification de JavaEE a été votée cette semaine.  Le vote (non) de la fondation Apache reflète une inquiétude grandissante chez les membres du comité d’après TheServideSide.com sans parler du débat sur le processus même d’évolution, certains militant pour un abandon du JCP (Java Community Process) pour un modèle complètement Open Source.

Un projet

logo de wix

Dans ce monde d’applications web ou SAAS (Software As A Service) on en oublierait presque les programmes d’installation…

Wix est un projet que Microsoft a arrêté de développer et l’a mis à disposition de la communauté qui l’a fait vivre depuis : la version 3 est sortie cet été.

Wix est un outil pour packager les applications. Comme l’illustre le tutorial très riche, les fonctionnalités de Wix sont riches. Basé sur XML il vous permet de gérer les dépendances comme le .NET Framework, les raccourcis ou encore les fichiers d’aide etc. Le support de Visual Studio 2008 prend la forme de plusieurs types de projets dont les customs actions pour étendre l’installation avec des étapes personnalisées. La mise à jour d’application est aussi gérée.

wixProjetcs

Déclaration d’une dépendance avec le .NET Framework :

<PropertyRef Id="NETFRAMEWORK35_CLIENT"/>
<Condition Message='This setup requires the .NET Framework 3.5 client profile installed.'>
  <![CDATA[Installed OR NETFRAMEWORK35_CLIENT]]>
</Condition>

Installation d’une base de données :

<sql:SqlDatabase Id='SqlDatabase' Database='Foobar' User='SQLUser' Server='[SQLSERVER]'
              CreateOnInstall='yes' DropOnUninstall='yes' ContinueOnError='yes'>
 <sql:SqlScript Id='CreateTable' BinaryKey='CreateTable' ExecuteOnInstall='yes' />
</sql:SqlDatabase>
 ou encore configurer le firewall.
Tuesday, December 08, 2009 5:44:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Tuesday, December 01, 2009

Les tweets de la semaine

 http://twitter.com/pedeveloper/statuses/6046161616 les index en base de données, on connaît mais les index clustérisés ? Un rapide et intéressant tour d’horizon des index sous SQL Server.

http://twitter.com/prodotnet pour apprendre (ou ré-apprendre) .NET un tweet à la fois.

La question Stackoverflow

 http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically Copier un objet de type valeur est facile, copier un objet de type référence l’est moins car il a souvent lui même des références vers d’autres objets d’où le concept de “deep copy”, “deep”car on doit gérer un graphe d’objets.

Actualités Microsoft

C’est le grand calme après la tempête PDC. Que retenir de cette édition ? D’après Keith Elder dans un post sur dzone il faut faire le pari de Silverlight 4 et Entity Framework. Il est vrai qu’avec la version 4 de Silverlight on arrive au WPF/E (Everywhere) annoncé lors de sa première incarnation. De son côté le framework de mapping objet relationnel semble être le plus stable des investissements fait dans  ce domaine et son orientation “POCO” est un très bon signe.

Actualités “Alt.NET”

Depuis que Volta a été abandonné par Microsoft, il y a une place pour un framework comme GWT en .NET. Script# est similaire mais incomplet. Un message sur la liste de discussion altnet parle d’un effort par un développeur, Frank, de répondre à ce besoin. Est-ce qu’il y une place entre Silverlight et le couple ASP.NET MVC + jQuery ? Si cela ne vient pas de Microsoft peut-être que la communauté délivrera, appel à contribution lancé donc.

De l’autre côté

 La beta d’Adobe Air 2 est sortie en même temps que celle de Silverlight 4. Flash a connu 4 grandes étapes :

  • la création du plugin en 1996-97 qui a permis d’utiliser (et d'abuser) des animations vectorielles
  • le codec vidéo qui a révolutionné le streaming de vidéo sur le web (et de perdre beaucoup de temps sur youtube.com)
  • Flex : peu connu du grand public (sauf pour les 10.000 clients Twitter), c’est avec Flex et ActionScript (le langage) que Macromedia a fait son entrée dans le monde du développement d’entreprise (avec un back-end en Java)
  • Air : qui permet d’exécuter un programme en dehors du navigateur.

On compare souvent Air et Silverlight car ils se positionnent comme la plate-forme “smart client” (et sont souvent cités comme les concurrents de HTML5). Silverlight a l’avantage d’offrir une expérience de développement unifiée (client et serveur en .NET), Flash/Flex/Air celui du pourcentage de déploiement sur les postes des particuliers. Dans sa dernière incarnation Adobe fournit dans la suite un nouvel outil Catalyst qui permet de passer plus facilement d’un design de contrôle purement vectoriel à un “skin”réutilisable dans l’environnement de développement. 

Un projet

logo

dotlesscss (.less{}) se propose de moderniser la manipulation et la définition  des feuilles de styles (CSS). Il existe des techniques pour optimiser les styles en utilisant les bons sélecteurs mais il est vrai que la maintenance peut être fastidieuse.

dotlesscss supporte par exemple la déclaration de variables globales, ici une couleur :

@brand_color: #4D926F;
 
#header {
  color: @brand_color;
}
 
h2 {
  color: @brand_color;
}

ou encore les propriétés calculées :

@the-border: 1px;
@base-color: #111;
 
#header {
  color: @base-color * 3;
  border-left: @the-border;
  border-right: @the-border * 2;
}
 
#footer { 
  color: (@base-color + #111) * 1.5; 
}

Autopromotion (juste un peu)

nVentive sera présente lors des TechDays à Montréal : Erik Renaud animera une présentation d’introduction sur le Test-Driven Development (TDD).

Tuesday, December 01, 2009 1:18:23 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Revue du Web
# Tuesday, November 24, 2009

Les tweets de la semaine

Voici un site intéressant pour suivre les tweets de la communauté .NET : http://managedassembly.com/twitter C’est seulement un groupe sélectionné, certains se transforment en “drama queen” parfois mais l’essentiel est là : le partage de connaissances au sens large dans la communauté .NET

La question Stackoverflow

http://stackoverflow.com/questions/289176/how-is-duck-typing-different-from-the-old-variant-type-and-or-interfaces Avec les fonctionnalités de C# 4 comme le mot-clé dynamic, on parle de duck-typing, mais que recouvre ce terme ? Une explication avec exemple dans la question de la semaine.

Actualités Microsoft

La PDC 2009 ne restera sans doute pas dans les annales comme une des plus importantes. Sauf peut-être pour les conférenciers qui ont reçu un PC portable Tablet PC gratuitement.

Comme on le pressentait dans cette chronique les semaines précédentes, les sessions et annonces ont tourné autour de Azure, Dublin, Office 2010 et Silverlight 4 avec aussi un bilan de Windows 7.

Azure : en plus de l’offre commerciale qui démarre en 2010, l’éditeur a annoncé un AppStore de Azure sous le nom de code Dallas qui sortira en beta dans le courant de l ‘année prochaine. Mais aussi des outils comme ce Power Pack de synchronisation de base de données SQL Server vers Azure.

Dublin : Le projet a au moins un nom : Windows Server AppFabric et une beta. Et Velocity, le cache distribué, est aussi absorbé dans ce projet qui permet manager WCF et le nouveau WF dans IIS. 

Silvelright 4 : en plus des nouvelles API autour de la webcam et l’accès au système de fichiers local, on assiste au un rattrapage (attendu) du framework avec la CLR classique : présence des ICommand et IDataeErrorInfo chères aux développeurs WPF, compatibilité des binaires (i.e. plus de projets spécifiques Silverlight pour les composants communs), Tim Heuer a comme toujours un billet qui détaille ces nouveautés.

Divers : sortie de ASP.NET MVC 2 Beta, des renommages de produits : RIA Services et ADO.NET Data Services tombent dans l’ombrelle de WCF, un protocole d'accès aux données basé sur Atom : OData , la sortie de Geneva ou Windows Identity Foundation … Ah si on oubliait : l’annonce de IE9 mais à part un Power Point repris partout les informations intéressantes seront divulguées lors de MIX2010 en mars prochain.

Actualités “Alt.NET”

Finalement la PDC virtuelle alternative (NotAtPdc) a connu un certain succès avec une vingtaine de sessions sur ASP.NET MVC, Entity Framework, les bonnes pratiques de développement et même Javascript :) Espérons que les enregistrements soient disponibles.

De l’autre côté

Terracotta a annoncé le rachat de Quartz (version java) après celui de EhCache durant l’été. C’est une tendance, beaucoup d’entreprises fondées sur un projet Open Source phare rachète des projets connexes pour bâtir une offre plus complète. JBoss, Spring en sont les exemples les plus cités. Terracotta a connu un vrai succès en simplifiant la distribution d’applications. En utilisant la manipulation de byte code au runtime, l’application permet à des threads sur des JVMs différentes (CLR en .NET) de communiquer comme si elle appartenait à la même. Les cas d’utilisation les plus courants sont la distribution de cache, la réplication de sessions ou le clustering de POJO ou Spring Bean.

Un projet

PostSharp est une librairie AOP pour .NET. Cette librairie ajoute le code de l’aspect après la compilation. On utilise souvent l’AOP pour des considérations techniques comme l’audit, le cache, les exceptions ou encore la démarcation des transactions sur des couches comme le fait Spring.NET.

Le projet est basé sur les attributs .NET, en héritant de OnMethodBoundaryAspect par exemple on développe un composant qui sera exécuté à l’entrée et à la sortie de la méthode :

public sealed class MyAttribute : OnMethodBoundaryAspect

On peut alors surcharger les méthodes pertinentes :

public override void OnEntry( MethodExecutionEventArgs eventArgs )
{
	Trace.WriteLine(
	string.Format( "Entering {0}.{1}.",
				   eventArgs.Method.DeclaringType.Name,
				   eventArgs.Method.Name ),
	this.category );
}
public override void OnExit( MethodExecutionEventArgs eventArgs )
{
	Trace.WriteLine(
	string.Format( "Leaving {0}.{1}.",
				   eventArgs.Method.DeclaringType.Name,
				   eventArgs.Method.Name ),
	this.category );
}

et appliquer cet attribut sur notre méthode :

[Trace]
private static void ToBeTraced()
{
    Console.WriteLine("Hello, world." );
}
 
PostSharp travaille sur les assembly compilées, au niveau du MSIL, il est donc compatible avec tous les langages .NET
Tuesday, November 24, 2009 3:00:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2] -
.net | Revue du Web
# Tuesday, November 17, 2009

Les tweets de la semaine

http://twitter.com/shanselman/status/5740020895 Channel 9 la chaîne pour les développeurs .NET diffusera en direct un flux vidéo depuis la grande salle du centre de conférence. Au menu : interviews et démos par les présentateurs, partenaires et développeurs de la communauté.

http://twitter.com/giovannibassi/statuses/5738375005 il y a bien une underground PDC (enfin pas si underground car le principal intervenant est Scott Gutherie) mais sur twitter on a trouvé la “nopdc”, une conférence virtuelle ou une simple blague ?

http://twitter.com/tomconte/statuses/5720465827 mise à jour du Azure SDK (Novembre 2009) juste avant la PDC. L’accent est mis sur le support de Visual 2010, l‘amélioration des fonctionnalités de logs mais aussi sur le service comme la puissance des machines virtuelles, les ports HTTP ouverts etc.

La question Stackoverflow

 http://stackoverflow.com/questions/36296/whats-the-answer-to-this-microsoft-pdc-challenge une question PDC sur Stackoverflow, un peu tirée par les cheveux mais sympathique, voir le lien de la première réponse pour un explication

Actualités Microsoft

Nous y voilà. La PDC est le rendez-vous des développeurs .NET. Pour se tenir au courant Twitter est d’une grande aide. Azure sera sûrement la vedette de cette édition, Visual Studio 2010 étant déjà disponible on pourra sans doute approfondir certains points. Des surprises ? Peut-être du côté de Sharepoint ou de Office en ligne dont on a pas entendu parler même si certains produits comme Excel sont déjà disponibles.

Actualités “Alt.NET”

On parlait récemment du manque de Maven pour les projets .NET. Voici un début de solution avec HornGet. Ce site est un repository des librairies et frameworks couramment utilités. On y trouve la version stable courante mais aussi le trunk. Voici un exemple avec NHibernate : http://www.hornget.net/packages/orm/nhibernate/ A chaque fois les dépendances sont incluses dans le package.

De l’autre côté

La version 3 de Spring va bientôt voir le jour. Du framework simplifiant le développement J2EE en passant par l ‘injection des dépendances, Spring a eu un fort impact sur la communauté Java. Racheté par VMware, le contenu payant (outils, support, serveur d’application …) est de plus en plus étoffé. Au niveau des fonctionnalités c’est le support des annotations (lire attributs en .NET) de plus en plus présents ainsi que des API REST complètes. Mais c’est aussi un mouvement de fond et Spring est passé d’une multitude librairies pour combler des manques à un stack complet qui  est en concurrence avec Java EE6.

Un projet

Quartz.NET est un portage .NET d’une librairie de planification de tâches. On y trouve toutes les fonctionnalités pour ce type de programme :

  • intégré ou application “stand-alone”
  • planification par trigger sur dates, calendrier particulier (calendrier avec vacances etc.)
  • l’application fournit simplement des “jobs” : classes implémentant une interface et instanciées. On peut pendre le contrôle de l’instanciation via une factory. 
  • des fonctionnalités “entreprise”comme le fail-over ou le load-balancing

Voici un extrait des tutoriaux :

// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();
// construct job info
JobDetail jobDetail = new JobDetail("myJob", null, typeof(HelloJob));
// fire every hour
Trigger trigger = TriggerUtils.MakeHourlyTrigger();
// start on the next even hour
trigger.StartTimeUtc = TriggerUtils.GetEvenHourDate(DateTime.UtcNow);  
trigger.Name = "myTrigger";
sched.ScheduleJob(jobDetail, trigger); 

Le planificateur a la notion de calendrier attaché aux triggers ce qui permet d’exclure des dates pour lesquelles ceux-ci ne se déclenchent pas  :

HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate);
sched.AddCalendar("myHolidays", cal, false);
// fire every one hour interval
Trigger trigger = TriggerUtils.MakeHourlyTrigger();
// start on the next even hour
trigger.StartTimeUtc = TriggerUtils.GetEvenHourDate(DateTime.Now); 
trigger.Name = "myTrigger1";
trigger.CalendarName = "myHolidays";
// .. schedule job with trigger
// fire every day at 08:00
Trigger trigger2 = TriggerUtils.MakeDailyTrigger(8, 0);
// begin immediately
trigger.StartTimeUtc = DateTime.UtcNow; 
trigger2.Name = "myTrigger2";
trigger2.CalendarName = "myHolidays";
// .. schedule job with trigger2 
Tuesday, November 17, 2009 3:22:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Wednesday, November 11, 2009

Les tweets de la semaine

http://twitter.com/adamhill/statuses/5433030511 : vous pensiez que les expressions lambda étaient la fin de vos peines de développeur ? Voici les “dynamic methods bags” avec C# 4. 

http://twitter.com/rbirkby/status/5309987820 le copier-coller le plus grand “ami” du développeur, voilà un outil pour détecter le code dupliqué.

http://twitter.com/Weiti/statuses/5473911173 snippet console, pour tester des bouts de code.

La question Stackoverflow

http://stackoverflow.com/questions/1694297/does-entity-framework-4-0-allow-to-work-without-designers

Entity-Framework en est déjà à la version 4 mais ne vous inquiétez pas si vous avez ignoré les versions précédentes, cette dernière incarnation de l’ORM de l’éditeur (rappelez-vous d’ObjectSpaces) est presque un nouveau produit. On y trouve la transparence des mécanismes de persistance et comme évoquée dans la question de la semaine une API du mapping plus accessible.

Actualités Microsoft

Encore quelques jours avant la PDC 2009, nous continuons le tour d’horizon du .NET Framework 4.0 avec WPF. Une technologie prometteuse mais peut-être trop innovante ? Un nouveau langage (XAML), un manque certain d’outils et de contrôles de base (vous avez dit DataGrid ?). Enfin tout cela était avant la version 4.0 qui occupe le devant de la scène : le nouveau Visual Studio 2010 utilise WPF comme moteur de rendu pour l’éditeur de code.On peut consulter ici la liste des nouveautés. Une des ressources les plus instructives sur le Framework de présentation est le blog de Jaime Rodriguez avec notamment son billet hebdomadaire qui condense des questions / réponses de la liste de diffusion interne de Microsoft.      

Actualités “Alt.NET”

On a beaucoup entendu parler ces derniers temps de Mono grâce à MonoTouch, le Framework qui permet de développer en C# des applications pour l’iPhone.  Mais l’hébergement est un domaine où Mono peut faire le différence. Pour ceux qui préfèrent un hébergement sous un OS alternatif, voici un blog qui offre quelques informations sur l‘installation de Mono.Une image avec un serveur virtuel préinstallé est disponible.

De l’autre côté

La fondation Apache fête ses 10 ans. Démarré avec le fameux serveur web, la communauté comporte maintenant 65 projets dont les plus connus comme Tomcat, Strut, Commons ont presque défini le mode de travail autour de l’open source pour les projets Java. Microsoft qui est devenu partenaire en 2008,  a lancé un site d'hébergement pour les projets : CodePlex et depuis peu une fondation Codeplex.org dont on attend encore les détails de fonctionnement mais qui à l’ instar de Eclipse ou Apache sera un lieu d’incubation et de développement pour des projets Open Source de la plate-forme .NET.

Un projet

Aujourd’hui pas de code, car ce projet n’existe pas encore ou du moins il est encore en phase de démarrage : Noda. Né de l’idée de John Skeet, employé de Google et ancien MVP C#, cette librairie sera un portage de la librairie Joda. L’objet ? Fournir une utilisation facile, performante et extensible des concepts de temps et date. Cela va de fournir des chronologies (ISO, Julian, Islamic) aux concepts comme les instants, les durées, les intervalles de temps et les calculs qu’on peut effectuer dessus.

Wednesday, November 11, 2009 3:40:00 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Friday, November 06, 2009

Nous organisons un atelier sur le TDD, Test-Driven Developement,  le vendredi 27 novembre. Cette journée attache beaucoup d’importance aux exercices et aux outils que vous utiliserez dans la vie de tous les jours pour pratiquer un développement agile.

Voici un extrait de la description – consulter le lien ci-dessous pour plus de détails sur l’agenda.

Dans la première partie de ce cours, nous répondrons à la question "Qu'est-ce le  TDD ?" mais aussi le "pourquoi, dans quel but et à quel coût ?"
La deuxième phase est plus axée sur la mise en pratique avec les outils et frameworks orientés « xUnit » autour de cas pratiques. On verra également dans cette partie l'utilisation des « stubs » et « mocks » ainsi que les différences entre les différents types de faux objets qui permettent l’isolation des tests.
Pour terminer, on explorera les meilleures pratiques du TDD, les  pièges à éviter. On jettera également un regard sur les méthodes périphériques comme le « Behavior-Driven Development » et l'íntégration continue.

Inscription : http://nventive.eventbrite.com/
Contact : info@nventive.net

Friday, November 06, 2009 3:20:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Agile - Development
# Monday, October 26, 2009

Les tweets de la semaine

http://twitter.com/PauloMorgado/statuses/5345415268: Pouvoir démarrer un serveur Cassini (le serveur utilisé par Visual Studio) à partir de n’importe quel répertoire, la solution pour ASP.NET 3.5 /4.

http://twitter.com/sensenet une alternative open source à Sharepoint

http://twitter.com/rogerjenn/statuses/5340211244 .NET Services va connaître une mise à jour majeure le 5 novembre, deux semaines avant l’annonce officielle de l’offre commerciale.

La question Stackoverflow

http://stackoverflow.com/questions/885955/whats-the-compelling-reason-to-upgrade-to-visual-studio-2010-from-vs2008

Pour continuer sur la sortie la semaine dernière de Visual Studio 2010 beta 2, voici une liste de fonctionnalités et améliorations pour vous déculpabiliser d'avoir installer une version beta sur votre poste de développeur (alors que votre patron vous l’a expressément interdit bien sûr).

Actualités Microsoft

Où est passé Dublin ? Le serveur d’application présenté pendant la PDC 2008 n’a pas fait beaucoup parler de lui depuis. Un planning a été annoncé : beta 1 fermée en fin d’année et RTM au printemps 2010 mais à part les présentations colorées on en a pas vu beaucoup plus sur l’assemblage de WCF et WF autour de IIS. En attendant on devra se contenter de retours sur certaines présentations. Le PDC répondra peut-être à certaines interrogations, mais WF4 et WCF4 sont déjà deux Frameworks pouvant nous occuper jusqu’au printemps…

Actualités Alt.NET

Si vous n’avez pas la chance d’habiter dans une ville dotée d’un groupe Alt.NET, vous pouvez assister aux réunions virtuelles : virtual ALT.NET (la section “recording” contient des archives). Par exemple, l’épisode “Separated Presentation” avec Jeremy Miller présente les différents patterns de présentation.

De l’autre côté

Amazon a ajouté un nouveau membre à la famille déjà bien nombreuse de ses services "cloud": RDS pour "Relationnal Databse Service”. Basé sur MySql ce service offre un stockage relationnel avec sauvegarde programmable. Azure SQL n’est donc plus seul face aux offres non relationnelles comme les très à la mode système “clé–valeur” qu’offre aussi Amazon (SimpleDB), Microsoft (Azure), Google (GAE et Big Table). Les détails de cette annonce en suivant ce lien. On trouvera une comparaison des offres d’Amazon et de Microsoft ici.

Un projet

PSake est un système pour construire (compiler, packager, déployer) des projets .NET. Le monde .NET n’a pas encore son Maven qui repose sur le principe “convention over configuration”. Il y a Nant, MSBuild mais aucun outil ne nous libère de la dure tâche d’écrire des scripts. PSake ne fait pas exception mais essaie de simplifier le travail. Basé sur Powershell, il expose le concept de tâche avec dépendances.

On commence par déclarer une liste de propriétés :

properties {
  $currentdir= resolve-path .
  $basedir= resolve-path .\..\..\
  $releasedir= 'C:\Release\'
  $releasewebsitedir = $releasedir+"_PublishedWebsites\Projet.Web.Web\"
  $solutionfile= "$basedir\Projet.Web\Projet.Web.Web.csproj"
  $configuration= 'staging'
}

Puis on définit une tâche par défaut :

task default -depends tacheDependante

Et on peut appeler ensuite des outils externes comme msbuild de façon simplifiée :

task Compile -depends Init { 
  exec msbuild "/p:OutDir=""$releasedir "" $sln_file"
} 

Le support pour des serveurs d’intégration continue (Cruise Control .NET, Team City, TFS ) fait encore défaut mais pour des projets de complexité moyenne, PSake est simple et rapide à mettre en place (et puis cela permet de se familiariser avec Powershell, ce qu’en tant que développeur on a toujours voulu faire sans jamais avoir eu le temps).

Monday, October 26, 2009 3:11:49 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Tuesday, October 20, 2009

Voici notre première revue du web sur l’actualité du monde .NET. Elle ne se veut pas exhaustive, nous essayons de mettre en avant des choses intéressantes, peu connues parfois mais toujours pertinentes. L’objectif est d’offrir une vue synthétique des nouvelles du développement sur notre plateforme préférée.

Vous trouverez 7 petites rubriques : les deux premières sont des extraits de sites qu’on ne présente plus maintenant (Twitter et Stackoverflow). Ensuite des actualités du monde Microsoft et de la communauté Alt.NET. Nous mettrons aussi en avant un projet ou une application .NET et jetterons un coup œil ailleurs (Java, Ruby, PHP) . Enfin on retiendra un évènement pour la semaine à venir.

N’hésitez pas à réagir dans la section “commentaires” !

Les tweets de la semaine

http://twitter.com/SharedProphet/statuses/4925873898
Une introduction à la nouvelle invention du père de Linq : Rx, Reactive framework

http://twitter.com/EdgarSanchez/statuses/4905530109 
ServiceStack : un stack alternatif à WCF pour faire de l’appel distant depuis Linux, Windows et une version pour MonoTouch

http://twitter.com/oising/statuses/4867514391
On a tous de belles machines en 64bit et on est tous un peu ennuyés par ce message du débogueur de Visual Studio : "Change to 64-bit applications are not allowed" voici une solution.

La question stackoverflow.com

http://stackoverflow.com/questions/9033/hidden-features-of-c

« hidden features of c# » c'est la question la plus "active". Il y a sans doute des choses que vous connaissez déjà dans cette liste, d'autres dont vous ne vous servirez peut-être jamais mais la parcourir de temps à autre, avec son café du matin, c'est toujours instructif.

Actualités Microsoft

Le site de MSDN a connu un lifting de son interface, ici le portail consacré à C# http://msdn.microsoft.com/en-us/vcsharp/default.aspx et le site de référence de l’API a aussi une nouvelle version légère.

Un site peu connu avec pleins de projets petits ou grands : http://msdn.microsoft.com/en-us/devlabs/dd125421.aspx

Dans un mois c'est la PDC 09 dont les grands moments seront sans doute : le lancement commercial de Azure, .NET Framework 4 et VS 2010.  http://microsoftpdc.com /    

Le support de MS pour jQuery continue encore plus avec la version 6 de la Preview des contrôles ASP.NET Ajax qui s’exposent aussi comme plugins jQuery : http://weblogs.asp.net/scottgu/archive/2009/10/15/announcing-microsoft-ajax-library-preview-6-and-the-microsoft-ajax-minifier.aspx

Actualités Alt.Net

Ce n'est pas de l'actualité chaude mais Karl Seguin (http://codebetter.com/blogs/karlseguin/ ), développeur canadien et membre de la communauté codebetter.com a publié un e-book de près de 80 pages sur les bonnes pratiques de développement : « Foundations of Programming ». Le sommaire est alléchant et une application accompagne le texte : http://codebetter.com/blogs/karlseguin/archive/2009/05/25/revisiting-codebetter-canvas.aspx

Ailleurs

Jetbrains, l'éditeur connu dans le monde .NET pour Resharper (le plugin pour Visual Studio) vient de rendre disponible une version gratuite de son produit phare IntelliJIDEA (un IDE Java) ainsi que le code source de la plateforme. La version dite communauté ne contient pas beaucoup de fonctionnalités au-delà de la programmation JAVA SE mais comme Eclipse un écosystème de plugin va sans doute apparaître.

Avec Eclipse, Netbeans et maintenant IntelliJIDEA, le monde des IDE Java semble plus dynamique que celui de .NET. MonoDevelop et SharpDevelop n'ont pas vu leur adoption croître beaucoup. Et les tentatives infructueuses comme celle de Together .NET de Borland ne sont pas là pour nous rendre optimistes.

On peut juste espérer que Visual Studio 2010 simplifie vraiment l’intégration de plugins.

http://www.jetbrains.com/idea/nextversion/editions_comparison_matrix.html?utm_source=IDEA_BLOG&utm_media=Anouncement&utm_campaign=IDEA9_CE

http://blogs.jetbrains.com/idea/

Un projet

http://www.sparkviewengine.com

Spark View Engine est un moteur de vue pour le Framework ASP.NET MVC (et Castle MonoRail) créé par Louis Dejardin (qui depuis a été embauché par Microsoft) pour un projet interne à son ancien employeur. Il simplifie la construction des pages en évitant les spaghettis de tags que représentent pour certains le moteur de vue par défaut de ASP.NET MVC.

Un des cas les plus courants courants les boucles.

  1: <viewdata Posts="IList[[MyApp.Models.Post]"/>
  2: <for each="var post in Posts">
  3:   <p>${post.Title}</p>
  4: </for>

ou encore plus simple :

  1: <var classes="new [] {'even','odd'}">
  2: <tr each="var user in users" class="${classes[userIndex%2]}">
  3: <td>${userIndex}) ${user.Name}</td>
  4: <td>${user.UserType}</td>
  5: </tr>
  6: </var>

L’intellisense est un peu dur à mettre en place mais avec Fluent HTML du projet  MVC Contrib on arrive à une productivité agréable :

  1: <content name="MainContent">
  2: <viewdata model="IList[[Story]]"/>
  3: !{this.Html.Grid(Model).Columns(column =>
  4: {
  5: column.For(x => x.Id).Named("ID");
  6: column.For(x => x.Title);
  7: column.For(x => x.DateSubmitted).Format("{0:d}");
  8: column.For(x => Html.ActionLink<StoryController>(c => c.Single(x.Ref), "View Details"))
.DoNotEncode();
  9: })}
 10: 
 11: </content>
 12: 
 13: 

Qui a dit « IntelliSense pour XAML ! » ?

ASP.NET MVC devient un des domaines où la communauté est des plus actives.

La semaine prochaine

La conférence Monospace sur 4 jours avec bien sûr la vedette du moment MonoTouch, l’environnement de développement .NET pour l’iPhone : http://monospace.us/

Tuesday, October 20, 2009 8:37:28 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Sunday, April 19, 2009

In an agile team, things go fast. And when things go fast, it usually gets messy. But then, why agile teams have proven record of success?

An agile method is based on a set of values and principles that embrace and  support each other. When one aspect of the philosophy looks like it’s not “formal” enough, another practice supports its weaknesses.

Environment

In order to stay focused on the task at hand, an agile team will have to setup its environment to make sure everything runs smoothly. They will create unit tests and make sure they get the green light prior to a check-in; but that’s usually not enough. They need to make sure it works on their machine and that it can work on any other box matching the requirements.Those requirements represent the environment the software needs to live in to run smoothly (or at all). It will vary but can usually include:

  • A specific version of the runtime
  • Third party assemblies deployed (locally or in the gac)
  • Configuration files at different URIs (ideally relative)
  • Environment variables
  • WMI schema registered
  • Registry entries

Continuous Integration

An many variables come into play, we need to make sure that for a given set of values, the software always works the same. In order to do so, agile teams will setup a clean environment (build server), seal it and automatically test that whatever changes in the software, it will continue to run on this environment. That’s what continuous integration (CI) is all about: continuously integrating the latest changes into a given environment and automatically checking that it installs correctly, that it runs as expected.

Contamination

Why isn’t the dev environment clean enough? Because we all know many things are going on and aren’t ideal on a dev box:

  • A newer version of a component is installed to test out features we might need in the future
  • A beta is installed and then uninstalled (partially)
  • Registry entries get deleted or manually added
  • Parallel versions are running
  • Debug versions are running
  • Bits exist locally but aren’t in sync with source control (think Lib folder)

Those are all reasons why it might “work on your machine” but not on “every machine”. Choose your side.

Long and External

When code changes, it might break existing assumption. Agile teams will try to document those assumptions in some executable format, usually unit tests. But not all tests are born equal. Some are bigger and broader that simple units. Some are testing the integration, the system and the use case as a whole. Should a developer wait for every single test to pass when he changes a string.Format() argument before he commits the change back to the repository? Ideally yes. But that’s not ideal; he might end up having to wait for a while for those exhaustive tests to pass (or will they?).

When you have a CI mechanism with a dedicated build machine; the whole suite of tests will automatically run in the background when something changes in the source code repository. While the developer continue working on new problems, he will get notified if something broke the build. The context the breaking change was made in has still not totally dissipated and it is easy to figure out what went wrong.

A long running test is one thing, but what about external tests? Some other teams might have some dependencies on your code. Some other projects of your own might have some dependencies on these modified bits? What then? Well they should also be part of the CI build so that they too can receive quick feedback that something is going wrong.

Tools

There are many tools to help you with CI. Cruise Control .net is one of the most popular. CI factory is a facade over CC.net that eases the configuration process.

Process

CI should be put in place as soon as possible; usually during Sprint 0 so that the team is up and running for Sprint 1 and leverage the short feedback loop quickly. A good enough CI environment can usually be setup in less than a day.

But what if it fails? What if it fails between the new tests have been committed and they don’t make sense? What if code shows a flaw in the acceptance criteria? What if you have a dedicated test team as opposed to a truly cross-functional dev team? That’s where things get interesting.

There’s no absolute truth to this one. However, depending on the type of test that failed (integrated or unit), it might end up being the dedicated test team that lives on the front line, assesses the bug and then informs the dev team that something went wrong.

() => “Francois”

Sunday, April 19, 2009 3:26:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1] -
.net | Agile - Development
# Wednesday, April 01, 2009

As you know, nVentive's founders Erik Renaud and Francois Tanguay are both MVPs. Now that means that we get an opportunity to work with Microsoft in order to provide feedback from our clients and the community. Now if you'd like to read more on what it means to Erik, go ahead and read it here !

 

Wednesday, April 01, 2009 4:27:05 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1] -
.net | Umbrella
# Thursday, January 01, 2009

The founders of nVentive, Erik Renaud and Francois Tanguay have both been awarded a MVP award. It is an honor to be recognized by Microsoft in this way and nVentive will continue to implicate itself in the community, following it's mission to perform coaching and guidance for agile software development using .net technologies.

Thursday, January 01, 2009 11:25:06 PM (Eastern Standard Time, UTC-05:00)  #    Comments [1] -
.net | Announcement
# Thursday, November 27, 2008

Part 1 and part 2 of this series were devoted to Unity, and part 3 introduced interception. Let’s examine Unity’s interception mechanism in more details.

Let’s look at the GetContainer method once again:

    1             public IUnityContainer GetContainer()

    2             {

    3                 IUnityContainer container = new UnityContainer();

    4                 container.AddNewExtension<Interception>();

    5 

    6                 //define how to intercept

    7                 container.Configure<Interception>()

    8                     .SetDefaultInterceptorFor<AccountingService>(new VirtualMethodInterceptor());

    9 

   10                 //create policy

   11                 container.Configure<Interception>()

   12                     .AddPolicy("SecurityPolicy")

   13                     .AddMatchingRule(new TypeMatchingRule(typeof(AccountingService)))

   14                     .AddCallHandler<SecurityCallHandler>();

   15 

   16                 return container;

   17             }

From this code, you can see a few concepts being introduced.

The first is the configuration of an interceptor, which defines how interception is to be made for the specified class. In this case, we are using the VirtualMethodInterceptor which creates a new class, on the fly, which derives from the AccountingService and overrides anything virtual as place holders for executing the policies (more on policies later).

The current interceptors are:

  1. VirtualMethodInterceptor, which can intercept virtual calls by deriving a a class from the intercepted class.
  2. InterfaceInterceptor, which can intercept any call on a given a interface, by creating a class that implements the specified interface and decorates the concrete type.
  3. TransparentProxyInterceptor, which can intercept anything deriving from MarshalByRefObject or an interface and reuses the .net technology for remoting. Out of the three, this is the slowest interceptor but also the one that is the most flexible.

The other part of configuring is the creation of a policy. A policy is basically something that has a name (RuleDrivenPolicy), knows how to identify things it needs to intercept (IMatchingRule) and calls handlers (ICallHandler).

Out of the box, Unity comes with many matching rules but no call handlers. If you are using Enteprise Libary’s PIAB, you will find that PIAB implements may call handlers for invoking the security, logging, exception management…

The following code will get you on your way to creating your own call handlers:

    1         public class SampleCallHandler : ICallHandler

    2         {

    3             #region ICallHandler Members

    4 

    5             public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)

    6             {

    7                 //before next CallHandler or Target Method

    8                 IMethodReturn result = getNext.Invoke().Invoke(input, getNext);

    9                 //after previous CallHandler or Target Method

   10 

   11                 return result;

   12             }

   13 

   14             public int Order

   15             {

   16                 get { return 0; }

   17                 set { }

   18             }

   19 

   20             #endregion

   21         }

Note that there is always a AttributeDrivenPolicy present in the container, which uses attributes for matching rules and call handlers. All you have to do is create attributes that derive from HandlerAttribute and off you go.

In part 2, we saw the we could also configure the container through xml configuration files. The same is true for interception and GetContainer would look like this:

    1             public IUnityContainer GetContainer()

    2             {

    3                 IUnityContainer container = new UnityContainer();

    4 

    5                 UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

    6                 section.Containers.Default.Configure(container);

    7 

    8                 return container;

    9             }

The exact same syntax as for configuring Unity, isn’t that great ! The backing XML though is another thing, here is an example:

    1 <?xml version="1.0" encoding="utf-8" ?>

    2 <configuration>

    3     <configSections>

    4         <section

    5             name="unity"

    6             type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />

    7     </configSections>

    8     <unity>

    9         <containers>

   10             <container>

   11                 <types>

   12                     <type type="Demo1.AccountingService,TestAssembly"/>

   13                 </types>

   14                 <extensions>

   15                     <add type="Microsoft.Practices.Unity.InterceptionExtension.Interception, Microsoft.Practices.Unity.Interception" />

   16                 </extensions>

   17                 <extensionConfig>

   18                     <add name="interception" type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationElement, Microsoft.Practices.Unity.Interception.Configuration">

   19                         <interceptors>

   20                             <interceptor

   21                                 type="transparentProxy">

   22                                 <default

   23                                     type="Demo1.AccountingService,TestAssembly"/>

   24                             </interceptor>

   25                         </interceptors>

   26                         <policies>

   27                             <policy name="SecurityPolicy">

   28                                 <matchingRules>

   29                                     <matchingRule

   30                                         name="matchingRule"

   31                                         type="AlwaysMatchingRule"/>

   32                                 </matchingRules>

   33                                 <callHandlers>

   34                                     <callHandler

   35                                         name="callHandler"

   36                                         type="SampleCallHandler"/>

   37                                 </callHandlers>

   38                             </policy>

   39                         </policies>

   40                     </add>

   41                 </extensionConfig>

   42             </container>

   43         </containers>

   44     </unity>

   45 </configuration>

Now how’s that for XML !!!

We hope that these posts will reassure you and help you integrate Unity into your software. Unity is quite powerful and we have only touched the surface. Feel free to write to use to get more information.

Thursday, November 27, 2008 11:41:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Microsoft PnP | Architecture
# Wednesday, November 26, 2008

In part 1 and part 2, we briefly explored what was Unity. In this part, we’ll introduce the subject of interception.

In releases prior to 4.1 of Enterprise Library, interception was something provided by the “Policy Injection Application Block”. One of the big moves for 4.1 was to refactor the functionality into Unity, and modify PIAB to be a facade (easier to use interface) over Unity.

But the question remains, what is interception. Interception relates to a programming technique called AOP (Aspect Oriented Programming) and deals with things that are mostly non-functional (logging, exception handling, security, caching…). This said, you would use interception to perform security checks (for example) in a transparent way while calling a target method on a target object.

    1         public class AccountingService

    2         {

    3             public virtual void Deposit(decimal amount)

    4             { }

    5         }

    6 

    7         public class FormController

    8         {

    9             public void DoSomething()

   10             {

   11                 IUnityContainer container = GetContainer();

   12 

   13                 var accountingService = container.Resolve<AccountingService>();

   14 

   15                 accountingService.Deposit(50.0m);

   16             }

   17         }

From this example, you see that we are resolving the AccountingService class through the container, and then calling the Deposit method. Let’s see how we implemented GetContainer() to account for interception.

    1         public IUnityContainer GetContainer()

    2         {

    3             IUnityContainer container = new UnityContainer();

    4             container.AddNewExtension<Interception>();

    5 

    6             //define how to intercept

    7             container.Configure<Interception>()

    8                 .SetDefaultInterceptorFor<AccountingService>(new VirtualMethodInterceptor());

    9 

   10             //create policy

   11             container.Configure<Interception>()

   12                 .AddPolicy("SecurityPolicy")

   13                 .AddMatchingRule(new TypeMatchingRule(typeof(AccountingService)))

   14                 .AddCallHandler<SecurityCallHandler>();

   15 

   16             return container;

   17         }

From this example, you cann see that we are asking Unity to intercept AccountService types using the VirutalMethodInterceptor, and to define a policy, that will be applied to types of type AccountingService who will invoke the SecurityCallHandler. The SecurityCallHandler is defined as such:

    1         public class SecurityCallHandler : ICallHandler

    2         {

    3             #region ICallHandler Members

    4 

    5             public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)

    6             {

    7                 throw new InvalidOperationException("You can't do that.");

    8                 //return getNext.Invoke().Invoke(input, getNext);

    9             }

   10 

   11             public int Order

   12             {

   13                 get { return 0; }

   14                 set { }

   15             }

   16 

   17             #endregion

   18         }

The call handler is what performs you non-functional code. This is where you would put your logging, validation, security, caching code, which would transparently wrap the object being intercepted.

More on the possibilities in part 4.

Wednesday, November 26, 2008 6:17:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Microsoft PnP | Architecture
# Tuesday, November 25, 2008

In part 1, we explored that basic functionality that Unity has to offer. In this post, we’ll explore a few more things in order to make Unity truly usable.

Back to dependency injection, we saw in part 1 that Unity will call the constructor with valid arguments. This is called constructor injection. There are two other types of injections, namely property and method that are resolved at creation time. Here are the examples.

Property injection:

    1         public interface IDatabaseContext { }

    2 

    3         public class DatabaseContext : IDatabaseContext { }

    4 

    5         public class AccountingService

    6         {

    7             [Dependency]

    8             public IDatabaseContext DBContext { get; set; }

    9         }

And method injection:

    1         public interface IDatabaseContext { }

    2 

    3         public class DatabaseContext : IDatabaseContext { }

    4 

    5         public class AccountingService

    6         {

    7             public IDatabaseContext DBContext { get; set; }

    8 

    9             [InjectionMethod]

   10            public void SetDatabaseContext(IDatabaseContext dbContext)

   11             {

   12                 this.DBContext = DBContext;

   13             }

   14         }

Of course, since a class can have more than one constructors, sometimes we need to help Unity by explicitly saying which one to use. Here is an example:

    1 

    2         public interface IDatabaseContext { }

    3 

    4         public class DatabaseContext : IDatabaseContext { }

    5 

    6         public class AccountingService

    7         {

    8             public IDatabaseContext DBContext { get; set; }

    9 

   10             public AccountingService()

   11             { }

   12 

   13             [InjectionConstructor]

   14             public AccountingService(IDatabaseContext dbContext)

   15             {

   16                 this.DBContext = dbContext;

   17             }

   18         }

Now for the other point that we’d like to cover: configuration. Unity’s approach to configuration is quite different that the one employed in Enterprise Library. API support is included in Unity’s core library and support for externalizing the configuration to XML configuration files is provided by the “Microsoft.Practices.Unity.Configuration.dll” assembly (and let’s not forget the “System.Configuration.dll” assembly). The technique used simply reuses the configuration API, which opens the door to home grown configuration plugins (i.e. from a database).

These are the things that you can configure in Unity:

  1. How to perform dependency injection (without the usage of attributes);
  2. The mapping of interfaces to their concrete classes;
  3. “Named resolves”, or the ability to ask the container to resolve something which is explicitly named;
  4. Lifetime managers, or how to control the lifetime of objects created by the container (The singleton pattern could be implemented by configuring the container with ContainerControlledLifetimeManager);
  5. Support for resolving arrays;
  6. And more…

Here is an example on how to consume external configuration:

    1             public IUnityContainer GetContainer()

    2             {

    3                 IUnityContainer container = new UnityContainer();

    4 

    5                 UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

    6                 section.Containers.Default.Configure(container);

    7 

    8                 return container;

    9             }

Of course, this will assume that a configuration section named “unity” exists in your application configuration file, that should look like this:

    1 <?xml version="1.0" encoding="utf-8" ?>

    2 <configuration>

    3     <configSections>

    4         <section

    5             name="unity"

    6             type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />

    7     </configSections>

    8 

    9     <unity>

   10         <containers>

   11             <container>

   12                 <types>

   13                     <type

   14                         type="Demo1.IDatabaseContext,TestAssembly"

   15                         mapTo="Demo1.DatabaseContext,TestAssembly"/>

   16                 </types>

   17             </container>

   18         </containers>

   19     </unity>

   20 </configuration>

These posts are not meant to explore every single feature present in Unity, but rather to get your started on the core concepts. Unity ships with plenty of documentation that will allow you to grasp what else can be done.

Coming up, part 3, which will introduce the subject of interception.

Tuesday, November 25, 2008 5:49:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Microsoft PnP | Architecture
# Monday, November 24, 2008

Unity is a Microsoft PnP product that is closely related to the philosophy of Enterprise Library and it’s application blocks. You can use Unity in your own applications in order to get a Dependency Inversion Container, or in less fancy words, functionality to resolve dependencies in a push matter instead of the traditional pull method.

Take for example this code:

    1         public interface IDatabaseContext { }

    2 

    3         public class DatabaseContext : IDatabaseContext { }

    4 

    5         public class AccountingService

    6         {

    7             public IDatabaseContext DBContext { get; set; }

    8 

    9             public AccountingService()

   10             {

   11                 DBContext = new DatabaseContext();

   12             }

   13         }

First of all, it uses interfaces (you are using interfaces aren’t you) and the AccountingService class has one major responsibility which we don’t like… it is responsible for creating an instance of a class (DatabaseContext) that implements IDatabaseContext. The whole concept of interfaces is that we can replace them, but with this code, even if the classes implement interfaces, we are hard coding the relationship of an IDatabaseContext to the concrete class of DatabaseContext.

Let’s refactor the code to the following to extract that creation responsability:

    1         public interface IDatabaseContext { }

    2 

    3         public class DatabaseContext : IDatabaseContext { }

    4 

    5         public class AccountingService

    6         {

    7             public IDatabaseContext DBContext { get; set; }

    8 

    9             public AccountingService(IDatabaseContext dbContext)

   10             {

   11                 this.DBContext = dbContext;

   12             }

   13         }

   14 

   15         public class FormController

   16         {

   17             public void DoSomething()

   18             {

   19                 var accountingService = new AcountingService(new DatabaseContext());

   20 

   21                 ...

   22             }

   23         }

This better code removes the creational responsibility from the AccountingService class, but just pushes up the relationship between the interface and it’s concrete to a higher layer, which is another bad thing.

Let’s introduce Unity into the equation and see what we can get:

    1         public interface IDatabaseContext { }

    2 

    3         public class DatabaseContext : IDatabaseContext { }

    4 

    5         public class AccountingService

    6         {

    7             public IDatabaseContext DBContext { get; set; }

    8 

    9             public AccountingService(IDatabaseContext dbContext)

   10             {

   11                 this.DBContext = dbContext;

   12             }

   13         }

   14 

   15         public class FormController

   16         {

   17             public void DoSomething()

   18             {

   19                 IUnityContainer container = GetContainer();

   20 

   21                 var accountingService = container.Resolve<AccountingService>();

   22 

   23                 ...

   24             }

   25         }

In this example we can see that we are asking Unity’s container to “Resolve” the dependency to an AccountingService. Unity will create the object, and realize that it’s constructor depends on a IDatabaseContext. At that point it will look at it’s configuration and lookup what concrete class was specified for that particular interface.

The implementation of GetContainer goes like this:

    1             public IUnityContainer GetContainer()

    2             {

    3                 IUnityContainer container = new UnityContainer();

    4 

    5                 //map the interface to it's concrete class

    6                 container.RegisterType<IDatabaseContext, DatabaseContext>();

    7 

    8                 return container;

    9             }

Up till now, these are the functionalities that we have explored from Unity:

  1. It can create object instances, just like the new operator does;
  2. It will resolve dependencies while creating objects, for example call the constructor with valid values;
  3. It allows mapping interfaces to their concrete classes, so that I can replace the concrete class in a central way;

In order for all this to work, you will have to add references to “Microsoft.Practices.ObjectBuilder2.dll” and “Microsoft.Practices.Unity”.

Unity allows for more complex configuration and dependency injection scenarios, which we will explore in part 2.

Monday, November 24, 2008 4:57:00 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Microsoft PnP | Architecture
# Tuesday, October 28, 2008

We are happy to announce (or repeat) that Enterprise Library 4.1 and Unity 1.2 from Microsoft PnP group is out. Why are we so happy, well nVentive collaborated with Microsoft on this project.

This service release is a minor one, but brings one major new functionality : Interception from Unity. If you are using Unity as your IOC, i strongly urge you to upgrade to this new version and find that:

  1. The container can resolve itself :)
  2. AOP programming is one step closer. You can reuse the matching rules and call handlers from PIAB, or invent your own.

We'll be blogging about this new release very soon, with code examples to get you going.

As always, you can find these on CodePlex (http://www.codeplex.com/unity or http://www.codeplex.com/entlib) or the msdn landing pages (http://msdn.microsoft.com/en-us/library/aa138002.aspx).

Tuesday, October 28, 2008 12:21:57 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Thursday, September 25, 2008

nVentive will be presenting it's "Top 10 Umbrellas" talk at the Ottawa.NET Community on Thursday, November 5th. Come and hear us talk about Umbrella and how the ideas within can save you development time.

Thursday, September 25, 2008 12:02:22 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Announcement | Umbrella
# Monday, September 22, 2008

One of the nice things of the latest versions of .net, is the ObservableCollection<T>. This class implements the new INotifyCollectionChanged interface (similar to INotifyPropertyChanged that we all know). Here is a small code example:

    1         [TestMethod]

    2         public void ObservingAReadOnlyObservableCollectionSucceeds()

    3         {

    4             //setup original collection with some initial content;

    5             ObservableCollection<string> strings = new ObservableCollection<string>();

    6             strings.Add("string1");

    7             strings.Add("string2");

    8 

    9             //setup readonly collection

   10             ReadOnlyObservableCollection<string> readOnlyStrings = new ReadOnlyObservableCollection<string>(strings);

   11             int addedElementsWhileObservingReadOnlyCollection = 0;

   12 

   13             //setup observer

   14             (readOnlyStrings as INotifyCollectionChanged).CollectionChanged += delegate(object sender, NotifyCollectionChangedEventArgs e)

   15                     {

   16                         if (e.Action == NotifyCollectionChangedAction.Add)

   17                         {

   18                             addedElementsWhileObservingReadOnlyCollection += e.NewItems.Count;

   19                         }

   20                     };

   21 

   22             //add one item, addign should be observed

   23             strings.Add("addedString");

   24 

   25             //assert

   26             Assert.AreEqual(3, readOnlyStrings.Count);

   27             Assert.AreEqual(1, addedElementsWhileObservingReadOnlyCollection);

   28         }

Notice the usage of ReadOnlyObservableCollection<T>, which can be used when you don't want someone to alter the contents of a collection.

These are the problems we see with all this new goodness:

  1. These types reside in the WindowsBase.DLL assembly with weird innapropriate namespaces.
  2. ReadOnlyObservableCollection<T> and ObservableCollection<T> implement INotifyPropertyChanged explicitly, meaning you have to cast to INotifyPropertyChanged to be able to use notifications.
Monday, September 22, 2008 5:48:40 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Friday, September 19, 2008

nVentive will be sponsoring the Montreal .NET community, it's our way of promoting this great group. They offer many meetings per month where great subjects are featured. It's one of our ways of offering coaching and guidance to the Montreal community.

Friday, September 19, 2008 1:22:06 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Announcement
# Tuesday, September 09, 2008

nVentive will be presenting some cool material at the new Microsoft TechDays conference in Montreal on November 6th and 7th. Be sure to be there as the subjects are the latest and will surely help you increae your team's software developement velocity.

Tuesday, September 09, 2008 3:51:52 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Announcement
# Wednesday, September 03, 2008

Well, such a nice tool was bound to be aquired by a company. Reflector has been acquired by Red-Gate software. You can find Reflector at http://reflector.red-gate.com.

Speaking of Reflector though, did you know there were over 30 plugins available ?

On the subject of plugins, the excellent TestDriven.net addin for Visual Studio will add a few context menu item for running your tests, but will also add one that allows you to jump back to Reflector. Isn't it nice when all these tools play nice together ?

Wednesday, September 03, 2008 2:27:09 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Wednesday, August 27, 2008

Grigori, from Microsoft's PnP announced last week that there will be a new version of Enterprise Library coming out. It's a smaller version, when you look at the features coming out, but it's a welcome one as a few bugs will be fixed.

The first intermediate drop (before the final release) of the source code is already there, so feel free to grab it and see how the new features can help you right now at http://www.codeplex.com/entlib.

Wednesday, August 27, 2008 1:39:53 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Tuesday, August 26, 2008

Visual Studio 2008 SP1 has been out now for a few days, and we must say we like it. It brings a ton of enhancements to the IDE and to the .NET framework; and these are the things that hit us the most:

  • Better WPF Designers - there were a few bugs in the original ones and I'm glad to say they are fixed.
  • Entity Framework - well we were waiting for this one for a long time. We can now start to build OR architectures with design tools provided by Microsoft. You might hear in the community that version 1 is not perfect, and they are right. Version 2 is coming out eventually and they are already discussing ideas for people to judge, see this rss feed. The team also has a wiki to gather community ideas.
  • ADO.NET Data Services - AKA Astoria, this project exposes a Data Service in a RESTful way. It can basically expose anything that is IQueryable and offers hooks to manage security, transactions, updates, etc... There is a small tool that will allow you to recreate the object model on the client side and get away from using the URL mecanism to query the service. This new service will yield a few new nice architectures we am certain.
  • ASP.NET Dynamic Data - This technology will allow you to rapidly generate an interface from metadata attached to a business object. It's basically a scaffolding technique in order to rapidly generate data driven applications.

We suggest you install this service pack as soon as possible and use it with your forth coming developments. It is rare that a service pack brings so much new technology to the table and they are all welcome.

 

Tuesday, August 26, 2008 1:33:22 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Monday, August 25, 2008

The Montreal .NET Community (formelly the GUVSM) has redone itself.

There is a new name and a new website in order to reflect the common interests that the community has in .net related technologies. There will be special interests groups for .Net, Team SystemSql and architecture. What's new though is that Francois and I will be pushing a new concept in the .net group called @Lunch.

@Lunch is basically an open session, once a month, where a subject will examined in a more informal way. It is modeled on the way Alt.NET and opens spaces work and will surely provoke a few interesting discussions. One of the things we will promote is to determine the subject of the next meeting, during the last few minutes of the meeting occuring. What an "Agile" way of learning what's most important. The first @Lunch is scheduled for September 24th and will be moderated by Francois, speaking on extension methods.

I suggest you visit the calendar, and find which sessions interest you the most. You can even subscribe to the calendar through a RSS feed; what a nice touch !

The last thing for this post is an upcoming Umbrella talk; we will be presenting our session called "Top 10 Umbrellas" at the .Net group of the Montreal .Net Community on October 20th. If you're interested in what it is, or how it can help you, we suggest you come by and listen what we have to say.

Monday, August 25, 2008 2:01:02 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Announcement | Umbrella
# Thursday, May 22, 2008

At DevTeach and the PnP Summit, there were talks on how to use instrumentation within your applications and use it to monitor the health of it throughout it's lifecycle.

At one of our past contracts, we had a problem where our users were not taking the time to test the system correctly. We then resorted to reuse the instrumentation module to track how often the individual functions of the application were used.

At first, it was only about helping them focus on the tests, or rather where they had not tested. But after a few months, it all changed; it actually became a measure of how useful the software was and what parts were being adopted.

It's motivated two things :

  1. When comes a time to prioritize backlog items, we can use these metrics to make sure we do things that are of the highest value for the customer, in parts of the system that we know have high traffic.
  2. Every time we add something to the system, we have metrics that can help us remove something else from the system. This allows the system to constantly stay the same relative size and not carry any "dead weight" into the future.

I'm not sure if Usage Coverage is a good term for these ideas, but for sure, I will be using them in future projects also.

Thursday, May 22, 2008 2:00:05 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Tuesday, May 20, 2008

For all those of you who asked about our session material, it is now available for download.

You'll have to login to your devteach account in order to be able to download the material. If the link doesn't work, go directly to the Schedule page, find our AOP + Unity session and you should be able to click on the Material link.

The .zip file contains both the material for the Validation + Security session and the AOP + Unity session.

Tuesday, May 20, 2008 2:02:40 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Saturday, May 17, 2008

For those of you who were at DevTeach Toronto and listened us talk about Enterprise Library 4.0 new features, we promised 4.0 was on the way. Well, it's officially released! You can get more information on Grigori's blog

Make sure to also look at what's new in the Unity 1.1 refresh.

Saturday, May 17, 2008 2:03:14 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Monday, May 12, 2008

Hopefully, after reading Part 1, Part 2, Part 3, Part 4 and Part 5, you should've become an Extension Method Master.

But there's more. There are other elements that can be simplified by using extension methods and that is, limiting usage of reflection.

Given something like:

public interface IServiceLocator

{

  T Resolve();

}

 

It is important to notice that the generic method Resolve has a type parameter for the sole purpose of providing the type to resolve. There are NO constraints.

One might use the service locator as follows:

public ILogger GetLogger()

{

  ILogger logger = serviceLocator.Resolve<ILogger>();

 

  return logger;

}

But what if the type to resolve is only known at runtime? You'll have to fallback on reflection:

public static class ServiceLocatorExtensions

{

  public static object Resolve(this IServiceLocator locator, Type type)

  {

    MethodInfo resolveMethodInfo = typeof(IServiceLocator).GetMethod("Resolve");

    resolveMethodInfo = resolveMethodInfo.MakeGenericMethod(type);

 

    return resolveMethodInfo.Invoke(serviceLocator, null);

  }

}

This approach can have terrible performance, especially since there is no reflection cache.

A far better approach is to define your IServiceLocator interface as a non-generic interface and provide strongly-typed extension methods:

public interface IServiceLocator

{

  object Resolve(Type type);

}

and

public static class ServiceLocatorExtensions

{

  public static T Resolve(this IServiceLocator locator)

  {

    return (T)locator.Resolve(typeof(T));

  }

}

 

Thoughts?

powered by metaPost

Monday, May 12, 2008 2:04:40 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Extension Methods
# Wednesday, April 30, 2008

Yesterday I was helping somebody with a small WCF application and one of the tools I proposed was a plugin visualizer for Visual Studio called WCF Visualizers. It's available freely on CodePlex and will allow you to see different parts of WCF (messages, endpoints, channels...) while you are debugging. Go and check it out, as there are some great images on the project page. The next time I give a WCF presentation with Francois at different user groups, I will also take the time demo this tool.

Wednesday, April 30, 2008 2:05:22 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net
# Monday, April 21, 2008

nVentive was present in Quebec city at HEROES happen {here}, Microsoft's launch for Visual Studio.Net 2008, SQL Server 2008 and Windows Server 2008.

François and I were experts there on the developer side of things, and the one thing we got asked the most, were questions on LINQ.

Everybody knows that LINQ is the hot new way to query objects in C# using a syntax similar to SQL. It depends on 2 tricks, Extension Methods and Lanbda Expressions.

This is a small sample.

public class Blog

{

   public string Title { get; set; }

}

class Program

{

   static void Main(string[] args)

   {

      IList<Blog> blogs = new List<Blog>();

      blogs.Add(new Blog { Title = "3 cheese lasagna" });

      blogs.Add(new Blog { Title = "Blue cheese alfredo sauce" });

      blogs.Add(new Blog { Title = "Macaroni and cheese" });

      blogs.Add(new Blog { Title = "Angel cake" });

 

      var blogsWithCheese = from blog in blogs

            where blog.Title.ToLower().Contains("cheese")

            select blog;

      //blogsWithCheese contains 3 elements.

   }

}

You can query something that is IEnumerable with LINQ to Objects, or a database itself using LINQ to SQL. If XML is your thing, there is a LINQ to XML variant and let's not forget that there is adapter to query Ado.Net DataSets. If you've heard of Entity Framework, LINQ will also work there to abstract it's object SQL language.

Now there's still more, if you have a source that you'd like to query with LINQ, it's just a matter of implementing IQueryProvider and IQueryable.

There are 2 tools I recommend you use in your adventures with LINQ:

  1. LINQPad is a interactive LINQ learning tool. Check it out, you'll never go back into Query Analyzer after that.
  2. Visual LINQ Query Builder is a plugin for Visual Studio 2008 that will help you develop your queries with a designer, now that's practical.

Monday, April 21, 2008 8:33:18 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | Announcement
# Saturday, March 29, 2008

We've covered a lot so far with Part 1, Part 2, Part 3 and Part 4 of this adventure with extension methods.

Looking back at it, there are some nifty features and side effects that might have been overlooked.

With the magic of generic methods and compiler type inference, we are able to get a pretty discoverable and predictable api.

Let's look at the test first:

  [Fact]

  public void GetProperty()

  {

    DateTime now = DateTime.Now;

 

    Assert.Equal(now.Day, now.Reflection().GetProperty("Day"));

  }

What's in there? Well first we see that there is a Reflection() extension point, and this typed extension point has a GetProperty method. This makes it really EASY to figure out what can be done by reflection.

What should the code look like?

Let's start by the extension point class that will scope all available reflection methods:

  public class ReflectionExtensionPoint

  {

    public T Instance { get; set; }

  }

The ReflectionExtensionPoint class is generic so it can hold the type for which we want to use reflection. So we don't have to instantiate it manually all the time, we can create an extension method that will create such an instance

  public static class ReflectionExtension

  {

    public static ReflectionExtensionPoint Reflection(this T instance)

    {

      return new ReflectionExtensionPoint { Instance = instance };

    }

  }

Here lies all the magic. Since the method is generic and there are no constraints define, we can use the Reflection extension method on anything. Furthermore, there is no need to specify the generic type argument as it is automatically inferred by the compiler

This allows for a pretty compact syntax as shown here:

  [Fact]

  public void ReflectionExtensionPoint()

  {

    DateTime now = DateTime.Now;

 

    ReflectionExtensionPoint<DateTime> extensionPoint = now.Reflection();

 

    Assert.NotNull(extensionPoint);

    Assert.Equal(now, extensionPoint.Instance);

  }

Now that we have an extension point almost for free that represents a clear and very predictable subset of functionality, we can extend-the-extension-point to add additional behaviors.

  public static class ReflectionExtension

  {

    public static ReflectionExtensionPoint Reflection(this T instance)

    {

      return new ReflectionExtensionPoint { Instance = instance };

    }

 

    public static void SetProperty(

      this ReflectionExtensionPoint extensionPoint,

      string name,

      object value)

    {

      PropertyInfo propertyInfo = typeof(T).GetProperty(name);

      propertyInfo.SetValue(extensionPoint.Instance, value, null);

    }

 

    public static object GetProperty(

      this ReflectionExtensionPoint extensionPoint,

      string name)

    {

      PropertyInfo propertyInfo = typeof(T).GetProperty(name);

      return propertyInfo.GetValue(extensionPoint.Instance, null);

    }

  }

Of course, extending the generic ReflectionExtensionPoint class, we need to make our extension methods generic as well so that we can propagate the extended type.

By now, unit tests should turn green, and we should be looking for next bits of business value to provide.

powered by metaPost

Saturday, March 29, 2008 1:59:11 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Extension Methods
# Friday, March 28, 2008

If you haven't read Part 1, Part 2 and Part 3 of this serie, go ahead, we'll wait right here.

In the previous post, we suggested that you can move instance methods that represent overloads to static extension methods.

It's been known for a while that static methods don't do well. They infer with most OO principles and are barely testable. Some will even define those as evil.

Selfishness

When you look at the definition of evil, it is used to indicate acts that are selfish.

Static Methods are selfish in the sense that they keep implementation details for themselves. They take control and keep it. They won't allow you to replace them with a mock version for test purposes. They won't allow their behaviour to be modified without digging into the inner guts and recompiling. They can't be decorated, they can't be proxied, they're selfish.

But can't we have both? The ease and greatness of extension methods without the selfishness and lack of testability of static methods?

Well yes you can... Sort of...

Let's start by looking at an extension method we previously developed:

public static class TypeExtensions

{

  public static bool Is<T>(this Type type)

  {

    return typeof(T).IsAssignableFrom(type);

  }

}

 

It contains almost no code but still, it can't be mocked nor replaced.

Make everything an instance again

In order to replace the implementation of this method with another one, we simply need to

1-Extract this method into an interface

public interface ITypeExtensions

{

  bool Is<T>(Type type);

}

2- Provide a default implementation.

public class DefaultTypeExtensions : ITypeExtensions

{

  public bool Is<T>(Type type)

  {

    return typeof(T).IsAssignableFrom(type);

  }

}

3- Make sure the extension method delegates to the instance method

public static class TypeExtensions

{

  public static ITypeExtensions Extensions = new DefaultTypeExtensions();

 

  public static bool Is<T>(this Type type)

  {

      return Extensions.Is<T>(type);

  }

}

Compromise

On the sunny side, we are now able to completely test our extension method implementation. It can also be mocked as we've extracted an interface. It can be replaced or decorated with a Thread-safe version.

On the dark side, you need to set your mock instance to the public static Extensions field in order for existing code to call the mock. It is sort of an indirect dependency.

Friday, March 28, 2008 1:57:28 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Extension Methods

Part 1 and Part 2 of this serie presented the basics and design guidelines for developing great extension methods.

Today, we'll try to show how extension methods can be a great tool to lessen the burden of implementing any given interface.

As an example, let's take a look at Unity for a moment.

IUnityContainer is the main interface of Unity. It acts both as a registry of registered type mappings between an abstract type and a concrete type; and as a Service Locator (Dependency Lookup).

What we're used to

Here's a snippet of the RegisterType method with its different overloads:

 public interface IUnityContainer

{

    //...

    IUnityContainer RegisterType()

      where TTo : TFrom;

    IUnityContainer RegisterType(LifetimeManager lifetimeManager)

      where TTo : TFrom;

    IUnityContainer RegisterType(LifetimeManager lifetimeManager);

    IUnityContainer RegisterType(string name)

      where TTo : TFrom;

    IUnityContainer RegisterType(string name, LifetimeManager lifetimeManager)

      where TTo : TFrom;

    IUnityContainer RegisterType(string name, LifetimeManager lifetimeManager);

    IUnityContainer RegisterType(Type t, LifetimeManager lifetimeManager);

    IUnityContainer RegisterType(Type from, Type to);

    IUnityContainer RegisterType(Type t, string name, LifetimeManager lifetimeManager);

    IUnityContainer RegisterType(Type from, Type to, LifetimeManager lifetimeManager);

    IUnityContainer RegisterType(Type from, Type to, string name);

    IUnityContainer RegisterType(Type from, Type to,

      string name, LifetimeManager lifetimeManager);

}

12 different overloads!!! In total, there are 39 different methods on this interface.

Let's focus on the RegisterType method for a sec. What are the main differences between those overloads?

First and foremost, there's the Generic-strongly-typed version and the loosely-typed version. Then there's the name parameter that allows you to register the same type multiple times with different names. Then there's whether or now you want to specify a lifetimeManager.

If we were to implement that interface and all those RegisterType methods, what would happen? How would we do it? Well, we'd probably chain them all to a single one; the same we do it with chained constructors, right? Which one? The more specific one? Definitely:

 IUnityContainer RegisterType(Type from, Type to, string name, LifetimeManager lifetimeManager);

This is the core method. The one that rules them all. All other overloads are only there to ease usage; at the cost of putting a large burden on the developer. If we want to write an IUnityContainer decorator, we'd have 39 methods to implement... again... and out of those 39 methods, only 3 or 4 would have any valuable logic...

Interfaces on a diet

What if we slim down those interfaces. Let's pretend for one moment that we have a great job at Microsoft, working for the p&p team; and most of all, we get to design Unity! Woohoo!

Since we've been reading the Coach Factor (or are about to), we decide to slim down those pesky interfaces. What would it look like? Well, we already answered this one:

public interface IUnityContainer

{

    //...

    IUnityContainer RegisterType(Type from, Type to, string name, LifetimeManager lifetimeManager);

}

Oh yeah! We just removed 11 methods out of 39. But now what? Will we put the burden on the client of this interface to always call RegisterType with all 4 parameters? Nah...

 

Extension Methos as Overloads

What if we leveraged our knowledge of extension methods to ease usage of our new slimmed down interface? What would it look like? Exactly! It would exactly look like what we have in the default implementation of the IUnityContainer interface:

public static class UnityContainerExtensions

{

    public static IUnityContainer RegisterType(this IUnityContainer container)

        where TTo : TFrom

    {

        return RegisterType(container, null, null);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, LifetimeManager lifetimeManager)

        where TTo : TFrom

    {

        return RegisterType(container, null, null);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, LifetimeManager lifetimeManager)

    {

        return RegisterType(container, null, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, string name)

        where TTo : TFrom

    {

        return RegisterType(container, null, null);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, string name, LifetimeManager lifetimeManager)

        where TTo : TFrom

    {

        return container.RegisterType(typeof(TFrom), typeof(TTo), name, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, string name, LifetimeManager lifetimeManager)

    {

        return container.RegisterType(typeof(T), null, name, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, Type t, LifetimeManager lifetimeManager)

    {

        return RegisterType(container, t, null, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, Type from, Type to)

    {

        return RegisterType(container, from, to, null);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, Type t, string name, LifetimeManager lifetimeManager)

    {

        return container.RegisterType(t, null, name, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, Type from, Type to, LifetimeManager lifetimeManager)

    {

        return container.RegisterType(from, to, null, lifetimeManager);

    }

 

    public static IUnityContainer RegisterType(

      this IUnityContainer container, Type from, Type to, string name)

    {

        return container.RegisterType(from, to, name, null);

    }

}

Now what?

Well now we can use the full range of overloads and keep IUnityContainer interface as small as possible. It is going to make it a lot easier to mock, decorate and implement the interface without losing any capabilities or ease of use.

Also, we've shared the implementation of overloads throughout all implementations, mocks and decorators of IUnityContainer.

Be careful when designing and trimming down interfaces. It is important that there is no logic associated with the overloads; that is; if registering a component without a name would make a difference and wasn't the equivalent of calling RegisterType(null) then this technique isn't necessarily appropriate.

powered by metaPost

Friday, March 28, 2008 1:56:32 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Extension Methods
# Wednesday, March 12, 2008

Part 1 presented a recap of extension methods. If you're not familiar with the concept, you should check it first.

Cohesion

The main concern with extension methods is that they aren't for everything; they have to be cohesive with the type being extended.

Let's say we add another extension method to the string class from the previous post:

  public static class StringExtensions

  {

    public static bool IsValidEmailAddress(this string instance)

    {

      if (instance.HasValue())

      {

        Regex expression = new Regex(

        @"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'

                *+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z             

                0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");

 

        return expression.IsMatch(instance);

      }

      else

      {

        return false;

      }

    }

  }

Does this really make sense? Definitely not!

A string is not intended to contain "exclusively" email addresses; so you end up polluting your string class with domain-specific extensions.

  public class StringExtensionsFixture

  {

    [Fact]

    public void ConnectionString_Polluted()

    {

      string connectionString = "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;";

      Assert.False(connectionString.IsValidEmailAddress()); //Doesn't make sense!

    }

  }

Facade

Extension Methods should really be used to facade and simplify usage of existing scenarios without adding extra coupling on external concepts:

  public static class TypeExtensions

  {

    public static bool Is<T>(this Type type)

    {

      return typeof(T).IsAssignableFrom(type);

    }

  }

 

  public static class TypeExtensionsFixture

  {

    [Fact]

    public void Is()

    {

      // Without the extension, logic relies on the understanding of the obscure method "IsAssignableFrom".

      Assert.True(typeof(IComparable).IsAssignableFrom(typeof(int)));

 

      // With the extension, the developer leverages existing knowledge of the "is" operator

      Assert.True(typeof(int).Is<IComparable>());

    }

  }

One imporant thing to notice here is the usage of a "generic" extension method. We'll delve into more details about generic extension methods in a subsequent post.

However, some cross-cutting concerns such as Serialization, Conversion, Equality benefit largely from being published as extension methods instead of remaining in their own "helper" classes. The main reason for this is discoverability. Some people will argue that since the extension method isn't part of the extended type per se, it lowers discoverability.  "Helper" methods aren't any more discoverable.

Extension Point

Let's say we want to add the serialization "functionality" to any object, we could use extension methods and write something like:

  public static class SerializationExtension

  {

    public static void ToXml<T>(this T instance, string fileName)

    {

      XmlSerializer serializer = new XmlSerializer(typeof(T));

 

      FileStream stream = File.OpenWrite(fileName);

 

      using (stream)

      {

        serializer.Serialize(stream, instance);

      }

    }

 

    public static void ToBinary<T>(this T instance, string fileName)

    {

      BinaryFormatter formatter = new BinaryFormatter();

 

      FileStream stream = File.OpenWrite(fileName);

 

      using (stream)

      {

        formatter.Serialize(stream, instance);

      }

    }

  }

SerializationMessy

What's the problem here? We started polluting the "Person" type with non-related concerns such as Xml and Binary serialization. Just imagine one moment all the additional methods that could suddenly appear and pollute the Person object. It would lead to "Extension Method Hell".

One remedy is to try to group those methods into "Extension Points", grouping them by how related the concern is.

Introducing: the Extension Point object:

  public class SerializationExtensionPoint<T>

  {

    public T Value { get; set; }

  }

 

The goal of the extension point is to wrap an instance with a "typed scope", allowing the extension methods to be programmed against the extension point instead of the instance itself.

  public static class SerializationExtension

  {

    public static void ToXml<T>(this T instance, string fileName)

    {

      XmlSerializer serializer = new XmlSerializer(typeof(T));

 

      FileStream stream = File.OpenWrite(fileName);

 

      using (stream)

      {

        serializer.Serialize(stream, instance);

      }

    }

 

    public static void ToBinary<T>(this T instance, string fileName)

    {

      BinaryFormatter formatter = new BinaryFormatter();

 

      FileStream stream = File.OpenWrite(fileName);

 

      using (stream)

      {

        formatter.Serialize(stream, instance);

      }

    }

  }

We've added the Serialization() extension method that provides the typed scope. Other scopes could group non-functional extensions like Equality, Conversion and Comparison.

Serialization

In the image above, we can clearly see that the interface is a lot more cohesive and has only been polluted with a Serialization aspect.

The complete code would look something like:

  public class SerializationExtensionFixture

  {

    [Fact]

    public void ToXml()

    {

      Person person = new Person { FirstName = "John", LastName = "Doe" };

      person.Serialization().ToXml("john.xml");

    }

  }

 

In the next post, we'll try to explore in more details how we can benefit from generics in extension methods.

Wednesday, March 12, 2008 1:55:15 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
.net | .net - Extension Methods

Extension Methods is a cool new feature of .NET 3.5. It's syntactic sugar invented mainly for LINQ and allow the developer to get rid of most of the static "helper" methods.

If you haven't delved into them, here's a quick recap on how they're implemented using C# 3.0:

  public static class StringExtensions

  {

    public static bool HasValue(this string instance)

    {

      return !string.IsNullOrEmpty(instance);

    }

  }

Just remember there are three steps to define an extension method:

    • static class

    • static method

    • this modifier

      Once that done, you can use the method like any other instance method:

        public class StringExtensionsFixture

        {

          [Fact]

          public void HasValue_Null()

          {

            string text = null;

       

            Assert.False(text.HasValue());

       

            // What the compiler is calling behind the scenes

            Assert.False(StringExtensions.HasValue(text));

          }

      
      

      However, extension methods are different from regular instance methods as:

      • They support null references

      string text = null;

       

      // Will not throw a NullReferenceException

      Assert.False(text.HasValue());

      • They allow you to extend sealed classes by adding methods

      public sealed class String { ... }

      In an upcoming post, we'll show you how design considerations are really important when extending existing types.

      Wednesday, March 12, 2008 1:51:48 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] -
      .net | .net - Extension Methods
      Search
      Archive
      <March 2010>
      SunMonTueWedThuFriSat
      28123456
      78910111213
      14151617181920
      21222324252627
      28293031123
      45678910
      Statistics
      Total Posts: 81
      This Year: 11
      This Month: 3
      This Week: 1
      Comments: 15
      Sign In