2010-01-15 6 views
0

J'ai besoin d'aide avec DLL architecture/design patterns/OO.Modèles de conception de fournisseur dans asp.net

J'ai appris des modèles de conception d'usine de classe comme une solution à mon défi actuel et pourrait utiliser quelques commentaires à ce stade.

J'ai trois classes qui sont des wrappers personnalisés pour ProfileProvider, MembershipProvider et RoleProvider d'ASP.NET 2.0.

Je voudrais mettre en œuvre une façon d'appeler chacun qui est raisonnablement simple et intuitif pour les développeurs. Quelque chose à l'effet de:

Object obj = new Users().Permissions.CreateRole(); 
Object obj = = new Users().Membership.CreateUser(); 
Object obj = = new Users().Profile.GetUserProfile(); 

Les exemples que j'ai lu sur la façon de le faire en utilisant un résumé usine classe (si, en effet, c'est la voie à suivre) sont un peu confus (je travaille mon chemin rond this link).

Des suggestions sur les meilleures pratiques pour commencer? Ou, encore mieux, des illustrations de code? :)

Répondre

1

Les API pour les classes de fournisseurs d'appartenances sont assez simples et je ne pense pas qu'il y ait beaucoup à gagner en les enveloppant. Je pense que ce que vous cherchez est le facade pattern. Fondamentalement, vous créez une classe qui encapsule les activités de gestion des utilisateurs pour votre application et masque l'implémentation interne. Les appels à la classe pourrait ressembler à:

userService.CreateAdminUser("keith", "godchaux"); 

la classe UserService utiliserait le fournisseur d'appartenances pour créer un nouvel utilisateur et attribuer le rôle d'administrateur pour eux.

+0

Merci Jamie, c'est exactement ce que je cherchais. Très apprécié. –

0

Il me semble que vous créez une abstraction au-dessus d'une abstraction sans but réel et sans réel bénéfice. J'ai des problèmes avec la façon dont les fournisseurs ASP.NET ont été implémentés (pour la testabilité), mais j'ai abordé cela d'une autre manière.

Ce que j'ai fait était de créer une classe qui enveloppait le MembershipProvider et implémentait une interface. Tout ce qu'il fait est de passer des appels de méthodes à MembershipProvider, mais cela me permet de me fier à l'interface au lieu de l'implémentation. Dans mes tests, je peux échanger IMembershipProvider pour une version simulée.

modifier, exemple de code:

IMembershipService

// Membership service that just provides Create/Delete 
public interface IMembershipService 
{ 
    IMembershipUser CreateUser(string username, string password); 
    void DeleteUser(string username); 
} 

et IMembershipUser

// IMembershipUser that provides a lot of the necessary details 
public interface IMembershipUser 
{ 
    string UserName { get; } 
    bool IsApproved { get; } 
    bool IsLockedOut { get; } 
    string Email { get; } 
    DateTime LastLoginDate { get; } 
    DateTime CreationDate { get; } 
    bool ChangePassword(string oldPassword, string newPassword); 
    string ResetPassword(); 
    Guid UserID { get; } 
} 

et une enveloppe simple pour fournisseur ASP.NET:

public class MembershipWrapper : IMembershipFactory 
{ 
    #region IMembership Members 

    public IMembershipUser CreateUser(string email, string password) 
    { 
     var user = System.Web.Security.Membership.CreateUser(email, password, email); 
     return new MembershipUserWrapper(user); 
    } 

    public void DeleteUser(string userName) 
    { 
     System.Web.Security.Membership.DeleteUser(userName); 
    } 

    #endregion 
} 

et MembershipUser

public class MembershipUserWrapper : IMembershipUser 
{ 
    private MembershipUser _User; 
    public MembershipUserWrapper(MembershipUser user) 
    { 
     _User = user; 
    } 
    #region IMembershipUser Members 

    public string ResetPassword() 
    { 
     return _User.ResetPassword(); 
    } 

    public bool ChangePassword(string oldPassword, string newPassword) 
    { 
     return _User.ChangePassword(oldPassword, newPassword); 
    } 

    public string UserName 
    { 
     get { return _User.UserName; } 
    } 

    public bool IsApproved 
    { 
     get { return _User.IsApproved; } 
    } 

    public bool IsLockedOut 
    { 
     get { return _User.IsLockedOut; } 
    } 

    public string Email 
    { 
     get { return _User.Email; } 
    } 

    public DateTime LastLoginDate 
    { 
     get { return _User.LastLoginDate; } 
    } 

    public DateTime CreationDate 
    { 
     get { return _User.CreationDate; } 
    } 

    public Guid UserID 
    { 
     get { return (Guid)_User.ProviderUserKey; } 
    } 

    #endregion 
} 

de mise en œuvre très simple, mais vous pouvez aller à la ville avec elle.

+0

Merci pour votre réponse statichippo.Si ce n'est pas trop demander, cela vous dérangerait-il de fournir un exemple de code esquissé/squelette afin que je puisse mieux comprendre comment vous avez attaqué cela? Merci encore. –

+0

Merci pour votre réponse et code-post Statichippo. Le motif de façade posté par Jamie est plus proche de la marque pour cet effort particulier, mais votre code a été très utile. Merci encore. –