Bons quiestions. Je pensais aussi à eux il y a quelques jours.
En fait, essayez NHibernate 3.0 alpha (ou le tronc actuel), son nouveau fournisseur LINQ est beaucoup plus grand que les précédents. (Jusqu'à présent, je n'ai trouvé qu'une seule méthode qui ne fonctionne pas, mais il est possible de connecter votre propre mécanisme si vous rencontrez quelque chose qu'il ne supporte pas par défaut.) Je n'ai pas eu de problème (encore?) À utiliser le courant tronc. Vous pouvez trouver une version "nocturne" sur le site http://www.hornget.net/packages/, ainsi qu'une version FluentNHibernate. Fluent augmente vraiment votre productivité si vous savez comment l'utiliser. La communauté SO really helped me with that, aussi. Si vous êtes d'accord avec votre couche de gestion ayant une dépendance directe sur NHibernate, ou si vous écrivez une application plus petite qui reste maintenable sans ce type d'abstraction, vous pouvez vous passer du modèle de référentiel. Cependant, si vous le faites correctement, cela peut vous éviter beaucoup de codage redondant.
La raison de l'abstraction n'est pas seulement utile car vous pouvez ensuite remplacer NHibernate par un autre ORM, mais c'est une bonne pratique à cause d'un concept appelé Separation of Concerns. Votre couche logique métier ne doit pas se soucier de savoir comment accéder aux données avec lesquelles elle travaille. Cela facilite la maintenance de l'application ou de ses différentes couches, ce qui facilite également le travail d'équipe: si X crée la couche d'accès aux données et que Y écrit la logique métier, ils n'ont pas besoin de connaître le travail des autres en détail.
Exposer un IQueryable<T>
est une très bonne idée, et c'est exactement ce que font actuellement de nombreuses implémentations de référentiel. (Et moi aussi, bien que je préfère l'écrire dans une classe statique.) Et bien sûr, vous devrez exposer certaines méthodes pour insérer ou mettre à jour une entité, ou des méthodes pour commencer et valider des transactions, si vous le souhaitez. (Le BeginTransaction devrait juste retourner un IDisposable
pour éviter les fuites sur une interface NHibernate, et ce sera très bien.)
je peux vous donner quelques directions: consultez les implémentations de SharpArchitecture ou FubuMVC Contrib pour obtenir quelques idées sur comment faites c'est vrai, et c'est how I solved it.
Comment ajouter un nouvel élément à la base de données avec juste linq? – Paco
@Paco: Ajout d'un nouvel élément à la base de données est assez facile à résumer, je ne parle pas de cela. La requête est le problème réel, car il n'existe pas de moyen simple d'activer des requêtes complexes dans un référentiel sans codage suffisant. – Groo