2010-02-06 5 views

Antwort

5

Nein. Ihre Controller sollten keine komplexe Logik verarbeiten. Halte sie schlank. Das Model (nicht DAO) sollte dem Controller alles zurückgeben, was er benötigt, um auf die View zu gelangen.

Das Anzeigen von Abfragen (oder sogar Abfragen) in einer Controller-Klasse ist etwas, was ich als Code-Geruch betrachten würde.

+1

Danke Aaron, Netter Punkt. Nichtsdestotrotz gibt es einige Vorteile der Verwendung von IQueryable, wie Flexibilität und Wartbarkeit von Diensten - weil die DAO-Schnittstelle weniger mit Pipes und Filtermuster wachsen würde. was denkst du? – SDReyes

+6

Spaghetti Code * scheint * einfacher zu pflegen, wenn ein Projekt jung und klein ist; Wenn das Projekt jedoch wächst, werden Sie es bedauern, keine klare Trennung der Bedenken zu haben. – Aaronaught

+2

Weitergabe Ihrer IQueryable und/oder Verwendung von Rohren und Filtern entspricht nicht Spaghetti-Code. Spaghetti Code ist in der Regel in Bezug auf Sprache oder Technik agnostisch. – jfar

4

Ich liebe die Weitergabe von IQueryable an meine Controller, da ich während der gesamten Lebensdauer meiner App-Entwicklung keine lahmen Paging- und Sortiermethoden in jeder einzelnen DAO-Methode und Schnittstelle erstellen muss.

GetCustomersByLastname(string lastname) 

wird schnell

GetCustomersByLastname(string lastname, string sortcolumn, int pagesize, int page) 

Immer wieder und immer wieder. Bleck!

Mit IQueryable können Sie Paging und Sortierung auf orthogonale Weise durchführen, z. B. indem Sie das IPagedList-Projekt nutzen. Durch die Rückgabe von IQueryable erhalten Sie außerdem einfachen Zugriff auf das gesamte Objekt .Count() ohne mehr Perversion Ihrer Datenschicht.

@ Roberts Argument von IQueryable entspricht fetten Controllern ist sehr wackelig. Ein Fat Controller wäre den aufgeblähten .aspx.cs Seiten von früher ähnlich. Wenn alles, was du tust, sich mit deiner DAL verbindet und dann die Ergebnisse von dir versendst, erhältst du keine "Fettigkeit" von deiner Abfragetechnik, du erhältst es von viel Logik innerhalb einer einzigen Klasse. Sie erhalten keinen Fat Controller aufgrund Ihrer Datenzugriffsmethoden, es sei denn, Sie beginnen mit der Protokollierung, Benachrichtigungen und anderen orthogonalen Problemen.

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

vs:

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

Ich sehe keinen zwingenden Unterschied.

@Mark Seemanns Antwort ist gleichermaßen wackelig. Sicher, Sie können Ihre gesamte Datenschicht in der Mitte eines Projekts ändern, aber das wird ein komplexes Desaster sein, egal wie abstrahiert Sie sind. Das von ihm verwendete Beispiel ist der Wechsel von Linq2Sql in den Tabellenspeicher von Windows Azure. RDBMS zu Schlüssel/Wert speichern? Und der Schwachpunkt ist Ihre Repository-Implementierung? Von RDBMS zu einem Key/Value Store zu gehen, wird eine Verrücktheit sein, die schrecklich wird, egal was passiert.

Mark bringt auch Domain Driven Design in seinem Argument. Ist das die Art von System Ihres Gebäudes? Gibt es genug "Domain" statt reine CRUD-Szenarien, die diesen Ansatz wertvoll machen? Wenn nicht, warum?

Die Verwendung von LINQ und der IQueryable-Schnittstelle verringert den Aufwand beim Datenschichtwechsel. Wenn Sie zwischen ORMs wechseln, die LINQ und IQueryableProvider unterstützen (ich denke, das ist der Name), interessiert sich nur der Downstream-Code für diese Änderung. Ihre Controller würden von den meisten auf dem Markt befindlichen ORMs unverändert bleiben.

+4

Wenn der Zweck dieses Sortierens und Paging ist, kann dies leicht mit einer "IPager " -Schnittstelle erreicht werden, die das "IQueryable " umschließt, aber immer noch ein Domänenmodell ausgibt. Ich benutze diesen Ansatz, es erfordert sehr wenig Code und beseitigt jede direkte Interaktion zwischen Controller und Datenbank. Dein Vergleich ist seltsam; Es scheint, als ob in Ihrem Projekt ein Domänenmodell fehlt. In diesem Fall gibt es natürlich keinen großen Unterschied - aber wenn Sie kein Domänenmodell haben, dann haben Sie MVC nicht wirklich. – Aaronaught

+1

Beachten Sie auch, dass ein Paging mit 'IQueryable ' (ich vermute, es handelt sich hier um eine Kombination aus 'OrderBy' und' Skip') ineffizient ist. Während es bequemer sein kann, damit zu spielen, erfordert effizientes Paging normalerweise die Verwendung von Raw-SQL oder gespeicherten Prozeduren, von denen keine sich gut für "Filter/Projektionen" eignen. – Aaronaught

+0

@Aaronaught Ich beziehe mich auf Domain-Design. Das Domänenmodell bedeutet für mich, dass jemand eine DDD-Technik verwendet, um seine App zu erstellen. Ich wies darauf hin, dass Roberts Antwort-Befürworter etwas für DDD tun. Wenn Sie nicht DDD als einige der Gründe für die Rückkehr IEnumerable gerade sind nicht da. – jfar