Alternatives pour faire du SQL avec .NET et C#

Lorsqu’il est venu le temps du choix de choisir le moyen de stocker les données de son application, le temps est à la mode de délaisser les bases de données relationnelles pour leur équivalent NoSQL.

Dans le monde .NET, il est possible d’utiliser des technologies comme MongoDB ou même RavenDB qui est de plus en plus populaire chez les programmeurs.

Une base données NoSQL comme RavenDB ne convient pas nécessairement à tous les scénarios de développement. Qu’en est-il de ceux qui désirent utiliser une base de données SQL? Est-ce qu’il y a des alternatives à l’utilisation de la classe SqlCommand?

Pour ces scénarios, j’ai arrêté mon choix à deux candidats qui font leur marque en utilisant deux approches différentes. Tout en ayant comme but de faciliter l’accès à vos bases de données.

Massive

Massive est une librairie développée par le très populaire Rob Conery. Cette librairie se vend comme l’outil vous permettant de résoudre la majorité de vos besoins d’accès de données avec un seul fichier de 673 lignes.

La simplicité de conception de Massive.cs est son principal atout. Il suffit d’intégrer le fichier source à votre application et vous serez en affaires. Notez qu’il vous faut une Connection string de proprement configurée à votre application.

Tel que décrit par son créateur, il faut concevoir Massive comme un Wrapper vous permettant d’accéder à vos données SQL. Son design vise une approche rapide sans dépendances pour accéder à vos donnés

Son utilisation est très simple et par les exemples disponibles sur la page d’accueil du projet GitHub permettent d’emblée de constater que Massive est conçu autour des dynamics ajoutés dans .NET 4.0.

Par exemple, il est possible de faire des requêtes à votre base de données en demandant à Massive de deviner vos intentions par convention.


//tiré de https://github.com/robconery/massive#code-please
dynamic table = new Products(); //"dynamic" is important here – don't use "var"!
var productsFour = table.Find(CategoryID:4,columns:"ProductName");

view raw

gistfile1.cs

hosted with ❤ by GitHub

Cette requête va retourner, sous une liste d’éléments, le résultat de la colonne ProductName de la table Products appartenant au CategoryID 4.

Selon la documentation, en plus de pouvoir faire des requêtes directes à vos données, vous pouvez arriver à :

Il est possible d’utiliser Massive avec les bases de données suivantes :

Simple.Data

Simple.Data se présente comme outil d’accès aux données dynamique ayant des fonctionnalités retrouvées dans un ORM plus classique.

Tout comme Massive, la composante dynamic de .NET 4.0 est au cœur de l’architecture de Simple.Data. Les requêtes que le développeur va construire seront décodées par convention afin d’y extraire les actions ainsi que les informations qui y sont désirées.

Simple.Data se veut comme un langage dédié (Un DSL pour ceux qui sont plus familiers avec l’anglais). Les requêtes sont, d’une certaines façon, paraphrasées en mots et interprétées par la librairie au moment de l’exécution.  À titre d’exemple, une requête permettant de retrouver un utilisateur par son identifiant courriel serait la suivante : Database.Open().Users.FindByEmail(email);.

Simple.Data support une un vaste éventail de plateformes. Autant des bases de données relationnelles traditionnelles que des bases de données NoSQL. Voici la liste :

Du point de vue des fonctionnalités, Simple.Data est assez complet et permet d’effectuer une gamme assez vaste de commandes et d’opérateurs vous permettant d’accéder à vos données. Bien entendu, l’insertion, la mise à jour ainsi que la suppression de données est permise.

D’ailleurs, sa nature dynamique permet à Simple.Data d’être un candidat de choix pour faire des tests unitaires. Un adaptateur de données uniquement en mémoire permettant de faire des requêtes sans avoir à accéder à une base de données réelle.

Conclusion

Les deux librairies ne sont pas réellement en compétition l’une envers l’autre. À mon avis, elles répondent à un besoin bien spécifique selon le genre d’opérations que vous désirez compléter.

Massive me semble pratique lorsqu’il est temps d’accéder à rapidement à des données sans trop se soucier de la réutilisation ou de l’architecture de votre couche d’accès aux données. On voit souvent cette application dans un contexte de preuve de concept.

Simple.Data se veut comme une alternative à un ORM que vous pouvez utiliser à toutes les sauces dans votre système lorsqu’il est temps de gérer l’accès à vos données. On remarque cette tendance par le soucis de testabilité de Simple.Data.

Interagir avec ses clients – Le guide du programmeur

Il y a une réalité qui ne peut pas échapper à un programmeur. D’une façon ou d’une autre quelqu’un va utiliser le code que vous allez écrire. Puisque qu’éventuellement ces gens vont utiliser ce code, ils vont, par extension, devenir un client.

À travers différents contextes dans ma carrière, j’ai eu à faire du support à mes clients. Peu importe la situation, il y a des règles que je considère universelles lorsqu’il est question de support client.

Pour certains, il peut être révulsant de prendre le temps soit par téléphone ou même par courriel de répondre à des questions et d’identifier des situations problématiques avec ses utilisateurs. Ces lignes directrices pourront vous éclairer sur ce qui est important.

  • Faire preuve d’empathie envers vos clients. Dans le processus d’acquisition d’informations pour une situation qui cause problème à votre client, faire preuve d’empathie contribue pour beaucoup à établir une confiance entre vous et le client. Un client qui vit une situation problématique avec votre application a besoin d’être écouté et compris.
  • Étant geek de nature, il arrive qu’on soit à court de mots pour aborder une situation. C’est là que je suggère d’apprendre certaines phrases par cœur au point qu’elles deviennent un automatisme. Par exemple : 
    • « Je suis désolé que vous éprouviez cette situation. »
    • « Si vous avez des questions ou des commentaires, je suis disponible toute la journée pour y répondre. »
  • Apprendre à écrire avec le moins de fautes d’orthographe possible. La communication par écrit doit être impeccable. Si vous faites des fautes sans bon sens, comment je peux vous faire confiance pour résoudre mes problèmes?
  • Être distancé émotionnellement de la situation et être calme. Il peut être difficile de le faire car il va arriver que ce soit directement votre code ou vos solutions qui soient en jeu. Cela va vous permettre d’être capable d’offrir une solution rapidement.
  • Vous n’êtes pas le problème. Vous êtes là pour fournir des solutions.
  • Portez attention au vocabulaire que vous utilisez. Les clients font face à des situations plutôt qu’à des problèmes.
  • Connaître son type de personnalité et apprendre à connaître la personnalité de votre vis-à-vis. Par exemple, quelqu’un de « Jaune » va apprécier quelques minutes de discussion « varia » avant d’entamer le vif du sujet. Un « bleu » va apprécier avoir une liste détaillée des changements qui seront apportés et un résumé hebdomadaire de l’avancement des travaux.
  • Vous êtes humain vous aussi. Il peut vous arriver de faire des erreurs et il est aussi admissible d’admettre que l’on a fait une erreur.
  • Être à l’écoute lorsqu’on vous parle. Dans bien des cas, la solution va sortir directement de la bouche du client. Après tout, ce sont leurs problèmes que vous tentez de régler.
  • Une relation avec un client ça se construit. Il peut y avoir des hauts comme des bas, l’essentiel est qu’il y ait du respect.
  • Soyez en engagés auprès de vos clients et respectez vos engagements. Est-ce que vous arriveriez en retard à votre propre mariage? Non? Ne laissez-pas tomber un client par votre manque d’engagement.

C# Dynamics

La dernière mise à jour majeure du Framework .NET a ajouté un concept ajoutant une couche permettant à C# d’agir comme un langage dynamique. Un langage dynamique permet d’être interprété qu’au moment de son exécution.

Dans les langages dits dynamiques, on retrouve des noms connus comme :

Un language dynamique fait contraste avec un language fortement typé où le code est exécuté au moment de la compilation de celui-ci.

Introduction du type dynamic dans .NET 4.0

Le type dynamic a été introduit à 4.0 afin de court circuiter  la validation statique des types. Cet ajout permet de d’écrire du code qui sera résolu une fois seulement qu’il sera exécuté.

Ce nouveau mot clé peut être utilisé à plusieurs sauces. Dans certains cas, son utilisation va sembler assez transparente. Par exemple, les types dynamics sont utilisés assez régulièrement avec ASP.NET MVC avec la mécanique du ViewBag.

Un bel exemple de la différence entre les deux concepts est le code suivant :


var x = 10;
var y = "2";
var result = x * y;

view raw

gistfile1.js

hosted with ❤ by GitHub

Le code exécuté en javascript va donner le résultat « 20 » car il s’agit de la multiplication de 10 et de 2. Le même code en C# ne passera pas l’étape de la compilation car il n’est pas possible de multiplier un nombre à une chaîne.

ExpandoObject

Une instance de la classe ExpandoObject vous permet d’avoir accès à un objet totalement dynamique dans lequel vous pouvez y enregistrer l’information que vous y désirez dans des propriétés. Ces propriétés peuvent être aussi être parcourues à l’aide d’une requête.

L’ExpandoObject expose un dictionnaire ayant la signature IDictionary<String, Object>) afin que vous puissiez y retrouver vos propriétés dans une boucle par exemple. Vous pouvez le faire de cette façon :


dynamic expando = new ExpandoObject();
expando.Title = "Ceci est un titre";
expando.Nom = "Paradis";
expando.Prenom = "Pascal";
foreach (var e in (IDictionary<String, Object>) expando)
{
Console.WriteLine(e.Value);
}

view raw

gistfile1.cs

hosted with ❤ by GitHub

Ce code va écrire à la console le texte suivant :

Ceci est un titre
Paradis
Pascal

DynamicObject

Considérant l’implémentation vraiment naive d’un objet servant de dictionnaire d’URL :


dynamic urlDictionnary = new UrlDictionnary();
urlDictionnary.HomePage = "http://www.parad.is&quot;;
urlDictionnary.About = "https://frenchcoding.wordpress.com/about/&quot;;
urlDictionnary.Blog = "https://frenchcoding.wordpress.com&quot;;

view raw

gistfile1.cs

hosted with ❤ by GitHub

Ce qui est important de savoir avec ce dictionnaire c’est qu’il hérite de la classe DynamicObject. DynamicObject permet à  une classe exposant des propriétés ou des fonctionnalités comme un dictionnaire ou une liste d’exposer ses propriétés de façon dynamique.

Dans le cas de cet exemple, il n’est pas question sa savoir quel algorithme de tri dictionnaire d’URL utilise pour trier ses élément mais plus de savoir qu’il est possible d’accéder dynamiquement à ses propriétés.

Pour avoir un minimum de fonctionnalités avec votre classe héritant de DynamicObject, il vous faut réimplémenter les fonctions TryGetMember et TrySetMember. Ces deux réimplémentations vont vous permettre d’avoir les fonctionnalités  vous permettant d’accéder et de paramétrer des propriétés dynamiques.

Voici un exemple excessivement simpliste vaguement tiré de MSDN


public class UrlDictionnary : DynamicObject
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
public int Count
{
get
{
return dictionary.Count;
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var keyName = binder.Name.ToLower();
if(dictionary.ContainsKey(keyName))
{
result = dictionary[keyName];
return true;
}
result = null;
return false;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
dictionary[binder.Name.ToLower()] = (string) value;
return true;
}
}

view raw

gistfile1.cs

hosted with ❤ by GitHub

Do Not Track

Do Not Track (DNT) est un standard proposé par le W3C qui  permet aux utilisateurs d’internet ne désirant pas être suivi par des services de publicités ou d’analyse de visites de les notifier de leur intention de ne pas l’être. Cette intention se signifie à l’aide d’une entête HTTP ajoutée à toutes vos requêtes HTTP.

Historiquement, le suivi des visites et de l’analyse des comportements sur un site web était limité au clics et des chargements de pages. Depuis la venue des Cookies, les compagnies de publicités ont trouvé d’innombrables moyens de suivre vos tendances de visites sur internet et de vous afficher du contenu qui correspond à vos besoins potentiels.

Certaines compagnies ont clairement signifé leur intention par écrit de respecter l’affichage de l’intention de ne pas être suivi. Il n’y a actuellement pas de mécanismes permettant d’obliger une compagnie de marketing à respecter l’intention d’un utilisateur à ne pas être suivi. Le respect de DNT est principalement effectué de bonne foi par les services ayant signifé leur intention de respecter.

Il est à noter que, depuis mai 2012, Twitter a décidé d’aller de l’avant avec le respect de DNT auprès de ses utilisateurs. Il s’agit de la première compagnie d’importance à aller de l’avant avec cette décision.

La responsabilité du signalement de DNT revient entièrement au navigateur web. Il est proposé que l’activation de DNT doit se faire dans les paramètres de configuration du navigateur web.

Le support de DNT est actuellement limité selon le navigateur web. Un support natif à Do Not Track est offert dans Internet Explorer 9 et Firefox 11. Google Chrome offre un support à DNT par le moyen d’une extension à télécharger. Le support officiel par Google Chrome est à venir selon les dires de Google.

L’activation de DNT est très simple. Sous Firefox, il faut aller sous Options \ Privacy et activer l’option Tell websites I do not want to be tracked.

Dans le concret, l’activation de cette option ajoutera l’entête HTTP DNT : 1 à vos requêtes HTTP.

L’ajout de Do Not Track est un premier pas dans le respect de la vie privée des internautes. Il va falloir encore quelques temps avant que son utilisation devienne une pratique courante dans l’industrie de la publicité et du marketing internet.

À mon avis, les attentes aux promesses de DNT ne doivent pas très élevées car une partie de son succès est dans les mains des compagnies de publicités qui ont des intérêts très différents de l’utilisateur moyen. Toutefois, il ne s’agit pas d’une raison de reculer pour faire avancer le respect des de nos droits sur le web.

Astuce Visual Studio : Sélection de texte en colonnes

Vous vous êtes probablement comme moi retrouvés plus souvent qu’autrement avec une sélection de code avec une indentation de trois quatre niveaux à coller? Ou même une sélection où vous avez oublié de sélectionner la première ligne entièrement?

Une sélection qui, sommairement, ressemble à celle-ci :


dynamic expando = new ExpandoObject();
expando.Title = "Ceci est un titre";
expando.Nom = "Paradis";
expando.Prenom = "Pascal";

view raw

gistfile1.cs

hosted with ❤ by GitHub

Bref, l’indentation est à refaire entièrement. À chaque fois!

Il y a pourtant une solution très simple dans Visual Studio. Il s’agit de la combinaison des touches SHIFT et ALT.

Son utilisation est très simple, il suffit de positionner son curseur au début de la sélection, d’appuyer sur les touches SHIFT et ALT et de faire sa sélection.

Il s’agit d’une astuce que je dois absolument ajouter dans mes habitudes de travail dès maintenant.

Happy coding!