3

Ich glaube, ich bin verwirrt mit dem Job eines Controllers in MVC.ASP.NET MVC - Job von Controllern

Ich habe einen Dienst, der fünf Funktionen aussetzt:

  • Liste Pakete in der Warteschlange
  • get Paket
  • löschen Paket
  • akzeptieren Paket
  • verweigern Paket

Meine Der ASP.NET MVC-Controller ist von diesem Dienst abhängig und ca In der Regel führen Sie einen Serviceaufruf für eine Aktion aus. Ich bin soweit glücklich.

Der zweite Teil erstellt dann das ViewModel-Ergebnis. Wenn ich dies innerhalb des Controllers mache, hat der Controller nun eine explodierende Abhängigkeitsliste - jede hinzugefügte Aktion erhöht die Abhängigkeiten, um das View-Modell aufzubauen, und diese werden alle vom Controller geerbt. Ich mag das nicht sehr. Ich baue diesen Controller, der von N verschiedenen View-Modell-Buildern abhängig ist, aber nur einen von ihnen pro Anfrage verwendet.

Also dachte ich daran, all das herauszuziehen und für jedes View-Modell spezielle Action-Filter anzuwenden. Ich habe das noch nicht gemacht, aber es scheint in Ordnung zu sein.

Die Frage, die dies für mich aufwirft, ist: Was ist die Verantwortung des Controllers? Wenn ich das Modell des Ansichtsmodells in Filter ziehe, tut mein Controller wenig mehr, als eine Route einen Service-Aufruf ausführen zu lassen (und ein Filter-Plugin zur Verfügung zu stellen). Wenn ich stattdessen meinen Controller für die Erstellung jedes Ansichtsmodells verantwortlich mache, wird es ein Chaos.

Es scheint, als ob ich fast eine Aktion pro Anfrage instanziieren möchte, keinen Controller, und ich missbrauche nur Filter, um das zu verstehen?

+0

Diese Frage benötigt einige Codebeispiele. –

Antwort

4

Haben Sie spezielle ViewModels und Poco-Modelle? Wenn dies der Fall ist, können Sie die Daten von den Diensten innerhalb des ViewModels verarbeiten. Ich bin ziemlich glücklich mit diesem Aufruhr.

public class PackageViewModel() 
{ 
    public PackageDetail{get;set;} 
    public int PackageID{get;set;} 
    public List<Package>Packages{get;set;} 
    public string SomeFilterCriteria{get;set;} 

    publlic void FillPackageList(IPackageService packageService) 
    {  
     Packages = packageService.GetPackages(SomeFilterCriteria);  
    } 
} 

In Controller:

public ViewResult ListPackages(PackageViewModel model) 
{ 
    model.FillPackageList(PackageService); 
    return View("ListPackages",model); 

} 

Ich verstehe nicht, was Sie unter "Ansicht Modellbauer" bedeuten.

+0

"Modellbuilder anzeigen" könnte sich auf das Zuweisen von Werten aus einem DTO zu einem Ansichtsmodellobjekt beziehen. Ich mache das gerade in meinen Controllern - nicht sicher, ob das der richtige Zug ist oder nicht, aber die Alternative, die ich sehe, ist das Übergeben eines DTO an den Konstruktor eines Viewmodels, von dem ich mir nicht sicher bin, dass es besser ist. – Sinjai

2

Der Controller soll alle Aktionen koordinieren, die in Ihrer Ansicht auftreten sollen. Wenn Sie diese Logik in Aktionsfilter ziehen, macht es immer noch die Logik pro Route-Anfrage, es wird in Ihrem Fall einfach sauberer.

Verwandte Themen