2009-07-27 6 views
10

J'ai deux référentiels Catalog et User, j'ai une situation où j'ai besoin d'appeler une méthode dans le repo du catalogue de l'user repo, est-ce une bonne pratique ou y at-il un meilleur moyen?Appel d'un référentiel à partir d'un référentiel

+0

Le problème. J'ai un Commentaire des méthodes liées dans mon repo de catalogue. Dans mon user repo, je veux ajouter la méthode canuserpost (qui interrogera db pour voir si suffisamment de commentaires ont été faits pour leur permettre de poster). Le code requis sera utilisé dans les deux repo où aller, dans un et référencer l'autre, les deux, selon la référence dfa à la couche de service ou autre chose? – monkeylee

Répondre

9

Vous ne devriez pas manipulez ce genre de contrôles d'autorisation au sein de votre Référentiels. Une règle métier telle que "Cet utilisateur a besoin de X commentaires pour publier" n'est pas vraiment une requête de référentiel, c'est une propriété de votre utilisateur.

De plus, les appels d'autorisation sont effectués très fréquemment dans une application, et vous ne voulez vraiment pas toucher votre base de données chaque fois qu'une vérification est nécessaire.

Vous devriez charger correctement ces autorisations dans votre objet utilisateur qui est ensuite mis en mémoire cache pour la demande actuelle, et utilisez votre domaine:

public class Service { 

    public void Save(Post post) 
    { 
     if(User.GetCurrentUser().HasEnoughCommentsToPost()) 
      postRepository.Add(post); 
    } 

} 
+0

+1 pour un bel exemple – dfa

+0

Je pense que la méthode Save devrait être la méthode de la classe User. Mais alors la classe User doit savoir sur postRepo. Est-ce une bonne idée? – mayu

6

Je renverrait l'autre dépôt à la couche supérieure, comme une couche de service

0

Je pense que dans votre autorisation de cas fait partie de votre logique de domaine. Je créerais donc une classe ou une interface abstraite appelée AuthorizationPolicy (peut-être que vous pouvez trouver un meilleur nom plus proche de votre domaine), dans ma couche de domaine. Avant d'appeler une méthode sur le référentiel, le client doit vérifier si l'autorisation est basée sur la politique. Une autre solution, car l'interface d'un référentiel fait également partie de la logique métier, vous pouvez créer une classe de base pour votre référentiel qui vérifie les autorisations de l'utilisateur et délègue le reste aux classes dérivées.

L'implémentation de AuthorizationPolicy communiquera avec la classe Catalog si vous le souhaitez. De cette façon, les deux référentiels sont bien découplés.

Questions connexes