8
votes

ASP MVC: Les services devraient-ils renvoyer Iqueryable?

Que pensez-vous? Si votre DAO renvoie-t-il une iquérissable pour l'utiliser dans vos contrôleurs?


0 commentaires

4 Réponses :


5
votes

non. Vos contrôleurs ne devraient pas manipuler une logique complexe du tout. Gardez-les mince; Le modèle (pas DAO) doit remettre le contrôleur tout ce dont il a besoin de passer à la vue.

Voir des requêtes (ou même des requêtes) dans une classe de contrôleur est quelque chose que je considérerais comme une odeur de code.


9 commentaires

Merci Aaron, bon point. Néanmoins, il y a des avantages d'utiliser Iquérisable, comme la flexibilité et la maintenabilité des services - car l'interface DAO augmenterait moins d'utiliser des tuyaux et des filtres. Qu'est-ce que tu penses?


Code spaghetti toujours semble plus facile à maintenir lorsqu'un projet est jeune et petit; Comme le projet grandit, cependant, vous commencerez à regretter de ne pas avoir une séparation claire des préoccupations.


Le passage de votre et / ou d'utiliser des tuyaux et des filtres ne correspond pas à un code spaghetti. Le code Spaghetti est généralement agnostique en ce qui concerne la langue ou la technique.


@JFar: La responsabilité d'une classe de contrôleur est de servir une vue basée sur une demande d'utilisateur. Comment se promener autour d'un iquéryable ou ayant une conscience de la base de données tout sauf le code spaghetti? Il brise complètement l'encapsulation fournie par le modèle de domaine. (Vous avez un modèle de domaine, non?)


Non, j'ai un modèle de persistance. Votre standard pour le code spaghetti est très faible si la différence entre les deux extraits de méthode d'action dans ma réponse est que l'un est «propre» et l'autre est spaghetti.


@JFar: A Persistence Le modèle n'est pas un Domaine modèle. Ma réponse à votre exemple était que non plus de code spaghetti maintenant , mais les deux sont très susceptibles de devenir le code spaghetti à mesure que les exigences changent, car vous passez autour d'une donnée (non domestique ) Objet dans une zone qui devrait être persistante - ignorante.


@Aronner. Le code spaghetti est le résultat de programmeurs de spaghetti. Ce que votre dicton est en quelque sorte, la modélisation du domaine empêche les mauvais programmeurs de créer un mauvais code. Bien sûr, un modèle de domaine riche aide à diriger les personnes dans la bonne direction, mais je pense que vous essayez de corréler Linq dans des contrôleurs aux mauvais programmeurs qui ne sont pas le cas.


@JFar: Non, ce n'est pas ce que je dis. Ne mettez pas de mots dans ma bouche. Les résultats du code Spaghetti de trop de correctifs appliqués à une conception à courte vue indépendamment de la capacité de programmeur. Devrions-nous faire de tous les champs de classe publique aussi, pour des raisons de commodité? Peut-être donner une vue sur l'accès direct au sqlconnection afin qu'ils ne doivent donc pas avoir à parcourir ce calque Pesky Model / Controller lorsque le client veut que nous ayons simplement fini?


@Aronner. Je n'ai pas fait. Je réfute vos déclarations que Linq dans la pratique de la programmation des contrôleurs rend le code de spaghetti et que des conceptions pilotées sur le domaine font de tout le monde Code Rainbows. Je ferai à nouveau référence à mes exemples qui ont de très petites différences syntaxiques et n'exposent pas du tout des informations de persistance sous-jacentes. La seule différence est que Linq a plus de points. ;) Je vais m'arrêter maintenant. Votre commencement de jeter des hommes de paille autour. Oui, bien sûr, je veux mettre du code SQL dans mon javascript. : / Et votre choix de mauvais exemples aussi; Il n'y a pas de champs privés en python.



4
votes

Pour le moment, cela semble attrayant, mais n'est vraiment pas .


0 commentaires

2
votes

Si vous suivez les "modèles de graisse, les contrôleurs maigres", paradigme, alors non.

Voir ce message sur le Contrôleur de graisse anti-motif .


0 commentaires

4
votes

J'adore passer à mes contrôleurs, car je n'ai pas à créer des méthodes de pagination et de tri boiteux dans chaque méthode et interface DAO tout au long de la vie du développement de mes applications.

public ActionResult Detail( string searchTerm )
{
    var model = MyDAL.MyObjects.Where( x => x.Name == searchTerm );
}


11 commentaires

Si le but de celui-ci est le tri et la pagination, cela peut facilement être accompli avec une interface iPager qui enveloppe le iquéryable mais sortit toujours un modèle de domaine. J'utilise cette approche, elle nécessite très peu de code et élimine toute interaction directe entre contrôleur et base de données. Votre comparaison est étrange; Il semble que votre projet manque de modèle de domaine, auquel cas, bien sûr, il n'y a pas beaucoup de différence - mais si vous n'avez pas de modèle de domaine, vous n'avez pas vraiment de MVC.


Notez également que toute commande faite à l'aide de iquéryable (je suppose que c'est une combinaison de OrderBy et Skip ICI) va être inefficace. Bien qu'il soit plus pratique de jouer avec cela, une pagination efficace nécessite généralement l'utilisation de procédures SQL brutes ou stockées, qui ne se prêtent pas bien à IQueryable filtres / projections.


@Aaronnaugers Je parle du design dirigé sur le domaine. Modèle de domaine pour moi signifie que quelqu'un utilise une technique DDD pour construire leur application. Je soulignais que Roberts liait la réponse aux avocats faisant quelque chose pour le bien de DDD. Si vous n'utilisez pas DDD que certaines des raisons pour lesquelles le retour d'Ienumerable ne sont tout simplement pas là.


@Aaronner votre deuxième commentaire est faux. Tous LinQ Enabled.net Orms Générez le SQL de pagination efficace juste bien à l'aide de .skip () et .take () éteint d'un iquéry.


Je ne suis pas et je n'ai jamais été un défenseur de DDD, MDD, TDD ou quelle que soit la dernière saveur agile du mois. Cependant, je crois qu'un modèle de domaine indépendant du modèle relationnel est tout simplement bon design dans presque toutes les applications. Plusieurs fois où j'ai sauté ce stade dans les objets de données passés et exposés grâce à des abstractions de haut niveau, j'ai par la suite regretté la décision. Juste mes deux cents. :)


Skip et Prendre Générez une requête de pagination à l'aide de Row_Number . Row_Number est un outil formidable et polyvalent, mais n'est vraiment pas efficace pour les grandes tables. Un exemple de solution beaucoup plus performante est ici: 4Guysfromrolla.com/wtbtech/042606-1 .shtml . Il y a sur une différence d'ordre de magnitude sur Row_Number .


@Aronner. Je pense que vous supposez que je retourne Sqldatreader dans mes contrôleurs ou quelque chose de tout aussi hideux. 90% du temps que la cartographie effectuée par Ormes crée un bon modèle de domaine pour l'expédition autour des écrans CRUD. Je pense que nous venons de venir de différents contextes ici. Je n'ai jamais regretté de ne pas faire un modèle de domaine complet à l'extérieur de la cartographie d'ormes et je trouve que cela garde les choses plus simples et plus rapides de coder.


@JFar: sqldatareader ne met pas en œuvre iquéryable autant que je sache. J'ai bien compris ce que tu parlais; Une collection de classes LINQ vers SQL constitue au mieux un modèle de domaine anémique. Peut-être fonctionnent-ils pour vous maintenant, mais comme marque expliquée, cela vous mordra souvent plus tard. La pagination est en fait un exemple parfait de cela; Si vous comptez sur iQuéryable pour une pagination "pratique", comment changeriez-vous votre implémentation de pagination à quelque chose de plus efficace ultérieurement?


@Aaronner votre préoccupation de pagination est très Yagni. L'article était une bonne lecture et j'ai beaucoup appris mais les statistiques def n'étaient pas impressionnantes. Personne ne va à la page via une table d'enregistrement de 100k. Les utilisateurs rechercheront quelque chose. Il s'agit d'une variante de «Et si vous avez des utilisateurs de Gazillion et des gigaoctets de données», quelque chose que la plupart des systèmes n'auront tout simplement pas. Je respecte votre opinion mais il semble que votre codage contre les présomptions de votre domaine soit riche et que votre échelle sera grande. Stackoverflow a été construit avec un "modèle anémique" et semble fonctionner correctement. ;)


@JFar: Je ne peux pas croire que vous avez réellement posté l'acronyme. Cela semble être l'excuse par défaut maintenant pour n'importe quelle faille de conception. Voici trois autres TLA agiles pour vous: SRP, DIP et SDP. Ainsi a une grande échelle mais une portée très limitée; La plupart des applications (en particulier des applications commerciales) do ont des modèles de domaine riches et ont finalement besoin d'augmenter également. Je le sais par expérience. Si vous ne pensez pas que une amélioration de la performance de 1 000% est «impressionnante», j'espère que je ne finirai pas d'utiliser une de vos applications.


@Aaronaught Je pense que vous avez cessé de lire mon dernier commentaire à Yagni. L'échange d'algorithmes de pagination est probablement le moindre de mes préoccupations lors du développement. Personne ne veut à la page via des tables record de 100k; La fonctionnalité de recherche est requise. Toute citation pour cette demande d'amélioration de 1000%? Cet article que vous avez posé précédemment n'est certainement pas une amélioration de la vitesse de 1000%. Le matériel de 4 ans de retour à 780 ms à son plus lent est plutôt bon pour une application commerciale. Qu'est-ce qu'un serveur DB moderne? 500 ms? Et aucune performance de 1000% sur 780 ms pour une application commerciale n'est pas impressionnante, c'est une perte de temps.