Que pensez-vous? Si votre DAO renvoie-t-il une iquérissable pour l'utiliser dans vos contrôleurs? P>
4 Réponses :
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. P>
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. p>
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 i> 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
@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 code> 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 I> 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 i> Le modèle n'est pas un Domaine i> modèle. Ma réponse à votre exemple était que non plus de code spaghetti maintenant i>, mais les deux sont très susceptibles de devenir i> 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 code> 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.
Si vous suivez les "modèles de graisse, les contrôleurs maigres", paradigme, alors non. P>
Voir ce message sur le Contrôleur de graisse anti-motif . P>
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 ); }
Si le but de celui-ci est le tri et la pagination, cela peut facilement être accompli avec une interface iPager
iquéryable
Notez également que toute commande faite à l'aide de iquéryable
OrderBy code> et
Skip code> 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
@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
@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
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 code> et
Prendre code> Générez une requête de pagination à l'aide de
Row_Number code>.
Row_Number Code> 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 code>.
@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 code> ne met pas en œuvre
iquéryable code> 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
@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 i> 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.