Singleton Design Pattern

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

Singleton design pattern
UML Class diagram Singleton

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

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

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

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

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

Finalement, la solution 4 est :

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

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

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

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

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

    private Singleton()
    {
    }

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

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

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

Comment rendre mes Assemblies visibles depuis Visual Studio

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

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

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

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

Ajout d'une clef de registre pour Visual Studio

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

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

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

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

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

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

Conclusion

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

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




Assemblies et le Global Assembly Cache (GAC)

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

Comment construire un assemblie multifichiers

Visualiser le contenu d'un assembly

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

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

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

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

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

Signer un assembly avec un nom fort

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

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

Installer un assembly dans le cache
Retirer un assembly du cache

Manifest d'assembli

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

Langage C#

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

Mots clefs du C#

using

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

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

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

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

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

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

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

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

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

static

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

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

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

  public Employee()
  {
      employeeCounter += 1;
  }

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

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

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

out

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

Types Nullables C#

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

Opérateur ??

Exemples :
int? c = null;

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

Accueil

Bonjour à vous, si vous visitez cette page,

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

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

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

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

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

Retrouvez moi sur le réseau social viadéo