2008-11-22 8 views
1

Je travaille actuellement sur mon première application asp.net mvc. J'essaie de boire le kool-aid de tous les exemples de projets que je vois et en essayant d'utiliser le modèle de conception de dépôt.Comment mettre à jour les champs créés et modifiés en utilisant le modèle de conception du référentiel?

J'ai une interface appelée IUserRepository qui ressemble à ce qui suit:

public interface IUserRepository 
{ 
    IUser Add(IUser user); 
    IQueryable<IUser> Fetch(); 
    IUser Update(IUser obj); 
    void Delete(IUser obj); 
} 

Mon interface IUser a un tas de propriétés et propriétés pour CreatedBy, CreatedDate, ModifiedBy et ModifiedDate.

Mon UserRepository se présente comme suit:

public class UserRepository : IUserRepository 
{ 
    private GimliDataContext db = null; 

    public UserRepository() 
    { 
     db = new GimliDataContext(); 
    } 

    public UserRepository(string connection) 
    { 
     db = new GimliDataContext(connection); 
    } 

    public IUser Add(IUser obj) 
    { 
     db.Users.InsertOnSubmit((User)obj); 
     db.SubmitChanges(); 
     return obj; 
    } 

    public IQueryable<IUser> Fetch() 
    { 
     return db.Users.Select(b => b as IUser); 
    } 

    public IUser Update(IUser obj) 
    { 
     var user = db.Users.Where(u => u.UserId == obj.UserId).Single(); 
     user.Name = obj.Name; 
     user.Password = obj.Password; 
     user.Email = obj.Email; 
     user.IsLocked = obj.IsLocked; 
     user.IsDisabled = obj.IsDisabled; 
     db.SubmitChanges(); 
     return user; 
    } 

    public void Delete(IUser obj) 
    { 
     var user = db.Users.Where(u => u.UserId == obj.UserId).Single(); 
     db.Users.DeleteOnSubmit(user); 
     db.SubmitChanges(); 
    } 
} 

Dans mes applications web actuelles lorsque mes utilisateurs se connectent Je planque mon entreprise principale client sur le thread courant et lorsque les objets de mon entreprise mise à jour je viens utilisateur la propriété Name sur la propriété Identity du directeur d'entreprise actuel et cela fonctionne très bien.

Alors, quelle est ma question? Dois-je faire la même chose avec les méthodes Add ou Update de mon référentiel OU serait-il préférable de passer une référence IUser à l'utilisateur actuel et de récupérer simplement l'UserId à partir de là?

Appréciez toute contribution!

Répondre

2

D'abord je suggérerais de rendre générique votre interface de dépôt. Au lieu de votre IUserRepository essayez ceci:

public interface IRepository<T> 
{ 
    T Add(T entity); 
    IQueryable<T> Fetch(); 
    T Update(T entity); 
    void Delete(T entity); 
} 

De cette façon, vous pouvez utiliser cette interface pour l'un de vos modèles de domaine.

En ce qui concerne votre question (CreadedBy et ModifiedBy props), personnellement, cela ressemble à une logique métier et conviendrait mieux à une classe de service. Mais je le ferais comme vous l'avez dit. Prenez l'identifiant utilisateur de l'utilisateur actuellement authentifié et placez-le juste là, au lieu de passer dans un autre IUser pour obtenir l'ID de. Mais si c'était dans un service, vous seriez alors en mesure de créer un service différent pour les tests unitaires, sans avoir à se connecter au système (le service moqué fournirait un faux simulateur).

Je suis moi-même un peu nouveau à ce sujet, donc s'il y a de meilleures suggestions, je voudrais aussi les lire.

+0

Merci David! Qu'entendez-vous par classe de service? J'utilise un service WCF pour m'interfacer avec le dépôt ... mais je ne sais pas si c'est ce dont vous parlez. – mattruma

+0

De rien. Pensez au service WCF comme votre niveau 'Présentation', vous voudriez toujours avoir une classe de service distincte qui pourrait être utilisée par le service WCF ainsi que d'autres clients non-WCF (gros clients, etc ...). Regardez Domain Driven Design qui vous renseignera sur les services. – David

Questions connexes