Question

Je travaille sur un projet utilisant ASP.NET MVC et un modèle de référentiel. J'ai des classes de référentiel et des services qui utilisent ces classes de référentiel. Ma question est la suivante: est-il correct de renvoyer un IQueryable à partir de ma classe de référentiel, puis d’utiliser ".Where"? et " .OrderBy " dans un service pour générer une liste? Si oui, est-ce la meilleure pratique?

Merci!

Était-ce utile?

La solution

Pour commencer, il n'y a pas de "droit". ou "faux" ici. C'est juste une question de ce qui fonctionne le mieux pour vous et le système que vous construisez. Par exemple, Rob Conery a créé un exemple d’application ASP.NET appelé Storefront avec exactement le modèle que vous décrivez, ce qui a déclenché une grande guerre des flammes. Une grande partie de la discussion a porté sur le modèle de référentiel considéré comme le "modèle original". comme décrit par Eric Evans dans son livre Conception gérée par le domaine et décrivant l'interface d’un référentiel comme acceptant et / ou renvoyant des instances réelles (de listes d’instances) et non une interface de requête.

Voilà pour la théorie. Que choisir pour votre système? La raison pour laquelle je ne choisirais pas directement la route IQueryable est que la stratégie de persistance qui en résulte est en partie infiltrée vers la couche client (la couche de service dans ce cas). Puisqu'il est principalement judicieux de renvoyer un IQueryable si vous récupérez des objets de la base de données à l'aide de LINQ vers [une méthode d'accès à la base de données (telle que SQL, Entités, ...)]. Alors seulement .Where ou .OrderBy optimisera le résultat de votre requête. Cela n'a évidemment aucun sens si vous utilisez un code de code d'accès à la base de données qui obtient une liste complète que vous exposez ensuite à partir du référentiel à l'aide de LINQ to Objects. En bref, vous associez votre couche client à la stratégie d’accès à la base de données que vous utilisez, basée sur LINQ.

Étant moi-même un peu puriste, je préférerais que ce lien avec LINQ ne ressorte pas de mon référentiel et que je choisisse de proposer des critères de localisation et de classement en fonction des paramètres des opérations du référentiel. Je peux faire toute l’optimisation de la récupération dans le référentiel et retourner un ensemble propre et net d’objets de domaine.

En fin de compte, tout se résume à ceci: tout ce qui vous convient le mieux va bien.

Autres conseils

Je ne vois pas pourquoi ce serait un problème. Si vous devenez plus précis dans les données que vous allez récupérer dans votre couche service, cela signifie moins de données transférées entre l'application et la base de données, ce qui signifie une efficacité accrue. Cela signifie que vous allez également implémenter le chargement paresseux ou obtenir les données lorsque vous en avez absolument besoin. Compte tenu de l’apatridie du Web, c’est une bonne chose. Vous ne voulez pas récupérer toutes les données au cas où vous pourriez les utiliser.

En d'autres termes, il est inutile d'obtenir la liste complète des utilisateurs, il suffit de sélectionner celui dont le nom est "Jackolantern".

La meilleure façon de penser à cela est la suivante: si vous décidez de passer de MSSQL à MySQL demain, devrez-vous reproduire la logique commerciale? Si tel est le cas, vous utiliserez votre référentiel incorrect.

Oui, je suis assez satisfait du renvoi d'IQueryable dans le référentiel, mais avec une mise en garde: quelques fonctions Linq ne sont pas disponibles pour tous les fournisseurs. Par exemple, les méthodes Single / SingleOrDefault ne sont pas disponibles dans Linq to Entities. Ainsi, votre couche de service devra peut-être sauter par-dessus des obstacles en fonction de l’implémentation concrète de votre référentiel utilisée.

Je mets généralement l'interface des classes du référentiel dans la couche de domaine et les implémentations réelles dans la couche de service.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top