In ASP.Net MVC, wenn ich eine Methode auf einem Controller, die eine Ansicht zurückgibt sollte diese Methode vom Typ ViewResult oder die allgemeinere ActionResult sein?
Antworten
Zu viele Anzeigen?Eine ähnliche Frage wurde in den ASP.NET-Foren gestellt: http://forums.asp.net/t/1423519.aspx
Im Grunde kommt es auf den Stil an - in OOP versucht man, den spezifischsten Typ zurückzugeben, den man in der gegebenen Situation zurückgeben kann. Man gibt nicht zurück object
für jede Methode, die Sie haben - manchmal geben Sie string
manchmal List
, manchmal eine benutzerdefinierte Klasse.
In den Antworten im Forum zitiert jemand Stephen Walther aus seinem Buch:
HINWEIS Diese Aktionsmethode umfasst insbesondere deklariert, dass sie eine Instanz von ViewResult zurückgibt. Sie würde genau so funktionieren funktionieren, wenn stattdessen der Rückgabetyp der Methode ActionResult wäre (die Basisklasse für alle Aktionsergebnisse). In der Tat, einige ASP.NET MVC Programmierer deklarieren alle ihre Aktionsmethoden als Rückgabe einer unspezifisches ActionResult zurück, auch wenn sie sicher wissen, dass sie immer eine bestimmte Unterklasse zurückgibt. Es ist jedoch ein etablierter Grundsatz in der objektorientierten Programmierung, dass Methoden den den spezifischsten Typ zurückgeben sollten, den sie können (und und die allgemeinsten Parametertypen Parametertypen akzeptieren können). Nach diesem Prinzip maximiert die Bequemlichkeit und Flexibilität für Code, der Ihre Methode aufruft, wie z.B. Ihre Unit-Tests.
Die Verwendung des spezifischeren ViewResult
vorzuziehen, vor allem aus der Sicht von Unit-Tests.
Eine Methode ist am nützlichsten, wenn ihre Parameter so allgemein wie möglich sind (z.B., IEnumerable<T>
anstelle eines Arrays) und sein Rückgabewert ist so spezifisch wie möglich (z.B., IList<T>
anstelle von IEnumerable
).
Beim Rückgabewert ist es jedoch immer noch besser, Schnittstellen oder abstrakte Typen anstelle von konkreten Typen zu verwenden (z. B., IList<T>
anstelle von List<T>
), was Ihnen eine gewisse Flexibilität bei der Änderung der Implementierung bietet oder zumindest die Kopplung mit dem aufrufenden Code minimiert.
Wenn Sie nicht vorhaben, das Ergebnis in eine andere Art von ActionResult zu ändern, können Sie es ein ViewResult zurückgeben lassen. Wenn Sie nicht vorhersehen, dass ein Aufrufer das ViewResult nutzen wird, kann es als ActionResult zurückgegeben werden, aber es spielt keine Rolle, wie auch immer.