jeudi 1 janvier 2009

MembershipProvider : implémentation 1/2

Explications

Pourquoi créer son MembershipProvider ?

C'est une couche d'abstraction qui se place au dessus de la gestion des utilisateurs.
Son principal avantage c'est de pouvoir être modifiée et étendue sans impact sur le code qui s'appuie dessus.

De plus, ASP.Net fourni en standard des contrôles exploitant le MembershipProvider, permettant de les mettre très simplement en place

Enfin, c'est très facile à mettre en place, à étendre et à modifier au besoin car le MembershipProvider est configurable dans le fichier web.config

Comment créer son MembershipProvider ?

Il suffit, dans un premier temps, de créer une classe dérivée de MembershipProvider, et d'implémenter toutes les méthodes abstraites requises.

Néanmoins, comme nous souhaitons exploiter au mieux notre classe métier User, nous allons devoir créer également une classe dérivée de MembershipUser

MembershipUser : implémentation

1) Dans le projet MvcBlog, dans le répertoire Code, créer une classe MyMembershipUser qui hérite de MembershipUser

2) Rajouter un champ _user de type User dans la région 'Private' / 'Inner Data'
Notre MyMembershipUser sera donc un adapter de User


#region Private

#region Inner data

/// <summary>
/// objet métier User associé
/// </summary>
private User _user = null;

#endregion

#endregion

3) Rajouter deux constructeurs :

Un constructeur vide dans la région 'Private' / 'Construction'
Il sert à verrouiller le constructeur vide ét éviter les instanciations inconsistantes

Un constructeur prenant une instance de User en paramètre dans la région 'Protected' / 'Construction'
Ce sera le constructeur officiel.
Noter qu'on y rajoute une sécurité en plus pour éviter qu'un MyMembershipUser ne puisse contenir un User vide.


#region Protected

#region Construction

/// <summary>
/// Constructeur basé sur un User
/// </summary>
protected MyMembershipUser(User user)
{
// si valide
if(user != null)
// on stocke
this._user = user;
// si non valide
else
// erreur
throw new InvalidOperationException("Impossible d'instancier un MyMembershipUser without a valid MvcBlog.Models.User instance");
}

#endregion

#endregion

#region Private

#region Construction

/// <summary>
/// Constructeur vide protégé, pour éviter les instanciatations inconsistantes
/// </summary>
private MyMembershipUser()
{
}

#endregion
...

4) Créer la méthode statique FromUser permettant de récupérer une instance à partir d'une instance de User


#region Static

#region Factories

/// <summary>
/// Construction d'une instance de MyMembershipUser à partir d'un objet User
/// </summary>
public static MyMembershipUser FromUser(User user)
{
MyMembershipUser retour = null;

// si valide
if(user != null)
// on instancie
retour = new MyMembershipUser(user);

return retour;
}

#endregion

#endregion

4) Surcharger les données de MembershipUser pour les récupérer dans notre instance de User.


#region Données surchargée de MembershipUser

/// <summary>
/// Login
/// </summary>
public override string UserName
{
get { return this._user.Login; }
}
/// <summary>
/// Email
/// </summary>
public override string Email
{
get { return this._user.Email; }
set { this._user.Email = value; }
}
/// <summary>
/// Date de création
/// </summary>
public override DateTime CreationDate
{
get { return this._user.DateCreation; }
}
/// <summary>
/// Clef de l'utilisateur pour le provider, on se sert ici de l'ID interne
/// </summary>
public override object ProviderUserKey
{
get { return this._user.ID; }
}

#endregion

5) Rajouter nos données personnelles


/// <summary>
/// ID internal de l'utilisateur
/// </summary>
public int ID
{
get { return this._user.ID; }
set { this._user.ID = value; }
}
/// <summary>
/// ID externe de l'utilisateur
/// </summary>
public Guid IDExternal
{
get { return this._user.IdExternal; }
set { this._user.IdExternal = value; }
}

6) Pour terminer, implémenter la méthode publique Update pour mettre à jour notre instance


#region Methods

/// <summary>
/// Met à jour l'utilisateur
/// </summary>
public void Update()
{
this._user.Save();
}

#endregion

L'adapteur est terminé. Dans l'article suivant, nous coderons le MembershipProvider à proprement parlé.

Aucun commentaire:

Enregistrer un commentaire