2009-04-12 9 views
12

Je suis nouveau dans le Repository Pattern et après avoir fait beaucoup de lecture sur le web, j'ai une compréhension approximative de ce qui se passe, mais il semble y avoir un conflit d'idées.Modèle de référentiel - POCOs ou IQueryable?

L'IRepository doit renvoyer un message.

Je voudrais traiter en seulement Pocos donc j'avoir une mise en œuvre IRepository pour chaque racine globale, comme suit:

public class OrangeRepository: IOrangeRepository 
{ 
    public Orange GetOrange(IOrangeCriteria criteria); 
} 

où IOrangeCriteria prend un certain nombre d'arguments spécifiques à la recherche d'une orange.

L'autre chose que j'ai est un nombre de back-end de données - c'est pourquoi je suis entré dans ce modèle en premier lieu. Je suppose que je vais avoir une mise en œuvre pour chacun, par exemple

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock etc

Je voudrais le garder ouvert pour que je puisse utiliser EF ou NHibernate - encore une fois, si mes IOrangeRepository traite à Poços je encapsulerait ceci dans le Repository lui-même, en implémentant un OrangeRepositoryNHibernate etc.

Est-ce que je suis sur la bonne voie?

Merci

EDIT: Merci pour les commentaires, je n'ai pas quelqu'un d'autre de rebondir ces idées hors au moment il est apprécié!

Répondre

9

Oui, votre version est la plus sûre/la plus compatible. Vous pouvez toujours l'utiliser avec toutes les ressources, pas seulement celles d'accès aux données, mais avec les services Web, les fichiers, etc. Notez qu'avec la version IQueryable vous pouvez toujours travailler en fonction de vos classes POCOs, mais vous êtes lié à IQueryable. Considérez également que vous pourriez avoir du code qui utilise le IQueryable et qui s'avère ensuite que vous rencontrez un cas où l'ORM du référentiel ne le gère pas bien.

5

J'utilise le même motif que vous. Je l'aime beaucoup. Vous pouvez obtenir vos données à partir de n'importe quelles ressources.

Mais l'avantage d'utiliser IQuerable est que vous n'avez pas à coder vos propres API de critères comme les OrangeCriteria.

Lorsque NHibernate prend en charge Linq, je peux basculer vers IQueryable.

Ensuite, vous obtenez

public class OrangeRepository: IOrangeRepository { 
    public IQueryable<Orange> GetOranges(); 
} 
Questions connexes