it-swarm.com.de

Was kann ASP.NET MVC und Ruby on Rails kann nicht?)?

ASP.NET MVC und Rails haben einen ähnlichen Anwendungsbereich, basieren auf derselben Architektur, beide Frameworks sind relativ neu und Open Source.

Als Rails Programmierer würde ich gerne wissen, was ASP.NET MVC kann und Ruby on Rails) kann nicht und umgekehrt?

37
Nikita Barsukov

Ich habe echte Anwendungen sowohl mit Rails als auch mit ASP.NET MVC entwickelt, aber diese Antwort ist mit einer erheblichen Einschränkung verbunden: Ich habe mit Rails vor Version 2 gelernt und entwickelt, daher ist es durchaus möglich, dass ich Ich bin mit meinem Rails Wissen) sehr veraltet.

Davon abgesehen glaube ich nicht, dass es irgendetwas gibt, das mit dem einen gemacht werden kann, aber nicht mit dem anderen. Angesichts aller Anforderungen an eine Webanwendung sollten Sie in der Lage sein, diese App - wahrscheinlich ebenso effizient - entweder mit Rails oder ASP.NET MVC) zu erstellen.

Es gibt ein paar nette Dinge, die nach meinem besten Wissen in ASP.NET MVC verfügbar sind, hauptsächlich aufgrund von Aspekten von C # /. NET. Beispiel: Wenn ich eine Seite habe, die ein Formular enthält, das gesendet wurde, würde ich eine Aktion haben, die prüft, ob es sich um ein GET oder ein POST handelt, um zu entscheiden, was zu tun ist:

def edit
  @item = Item.find(params[:id])

  if request.post? 
    @item.update_attributes(params[:item])
    redirect_to :action => 'edit', :id => @item.id 
  end
end

Dies ist ein triviales Beispiel dafür, aber das if request.post? Muster ist in Rails sehr verbreitet. In nicht trivialen Fällen kann der Aktionscode groß und unordentlich werden, und oft würde ich mir wünschen, dass ich ihn sauber in separate Methoden umgestalten könnte. In ASP.NET MVC kann ich das tun:

public ActionResult Edit() {
  // Render my page that has the Edit form
  ...
}

[HttpPost]
public ActionResult Edit(Foothing foo) {
  // Save my Foothing data
  ...
}

Ich denke, dass es ordentlich ist, die Behandlung von GET- und POST - Anfragen sauber zu trennen. Ihr Kilometerstand kann variieren.

Die andere Sache, die ASP.NET MVC macht, ist super cool (wieder meiner Meinung nach), hängt auch mit dem Umgang mit Formular-POSTS zusammen. In Rails muss ich den Hash params für alle meine Formularvariablen abfragen. Angenommen, ich habe ein Formular mit den Feldern "Status", "Gonkuliert", "Invertieren" und "Disposition":

def edit
  @item = Item.find(params[:id])

  if params[:status] == "new"
    ...
  else
    ...
  end

  if params[:gonkulated] == "true"
    ...
  else
    ...
  end

  if params[:invert] == "true"
    ...
  else
    ...
  end

  # Rest ommited for brevity
end

Mit ASP.NET MVC kann ich jedoch alle meine Formularwerte als Parameter für meine Action-Methode abrufen:

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

Das sind die beiden Dinge, die ich an ASP.NET MVC oder Rails wirklich geliebt habe. Sie sind kein Grund genug für einen vernünftigen oder kompetenten Entwickler, ein Framework über das andere zu wählen.

31
Adam Crossland

Ein Vorteil von ASP.NET MVC gegenüber Rails ist, wenn Sie eine neue Anwendung über eine vorhandene Datenbank erstellen müssen. Rails ActiveRecord ist sehr einfühlsam darüber, wie Tabellen strukturiert sein sollten (Tabelle muss eine haben) und nur eine Ganzzahlspalte als Primärschlüssel mit dem Namen 'id' usw.) Wenn Ihre vorhandenen Tabellen nicht den ActiveRecord-Einstellungen entsprechen, ist es schwierig, ActiveRecord zum Laufen zu bringen. Entwickeln Sie jedoch eine neue App mit einer neuen Datenbank mit ActiveRecord und Rails ist schnell!

ASP.NET MVC verfügt nicht über Standard-ORM. Sie können eine Datenzugriffsstrategie auswählen, die Ihren Anforderungen entspricht. Einige ORM wie nhibernate können ältere Datenbanken unterstützen. Sie können Guid-Primärschlüssel usw. haben.

Es gibt eine Alternative zu Rails ActiveRecord namens DataMapper , aber ich habe es nicht ausprobiert.

6
Endy Tjahjono

Ich habe noch nie mit Ruby on Rails) gearbeitet, daher bin ich nicht genau qualifiziert, um diese Frage zu beantworten, aber eine Sache, die ich an ASP.NET MVC sehr mag, ist die Typensicherheit Adam Crossland und rmac haben in ihren Kommentaren kurz darauf eingegangen, aber ich möchte darauf hinweisen, dass bei einer Controller-Methode wie der folgenden jeder Parameter stark typisiert wird. Dies macht den Code in der Edit-Methode viel sauberer Sie müssen sich keine Gedanken über die Konvertierung von Zeichenfolgendarstellungen in richtig typisierte Variablen machen.

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

Der andere Ort, an dem diese Typensicherheit angezeigt wird, ist in Ansichten und Teilansicht, wo eine Ansicht einer Teilansicht einem einfachen alten C # -Objekt zugeordnet werden kann, das als Modell für diese Ansicht oder Teilansicht dient. Dies erleichtert das Leben erheblich, insbesondere wenn Sie eine Hierarchie von Ansichten erstellen möchten, die andere Ansichten enthalten.

Wenn Infinity.ViewModels.Site ist der Namespace, der eine Klasse mit dem Namen ContactViewModel enthält. Bei Rasiermesseransichten setzen Sie eine Zeile wie diese oben in die Ansicht:

@model Infinity.ViewModels.Site.ContactViewModel

bei ASPX-Ansichten deklarieren Sie die Ansicht folgendermaßen:

<%@ Page Language="C#" ="~/Views/Shared/Site.master" ="System.Web.Mvc.ViewPage<Infinity.ViewModels.Site.ContactViewModel>" %>

Sie ordnen die tatsächliche Instanz des Modellobjekts der Ansicht in der Controller-Aktionsmethode zu und greifen dann über die Eigenschaft Model der Ansicht auf die Instanz des Modellobjekts in der Ansicht zu.

Diese starke Typisierung ist für mich super cool. Das Team, das ASP.NET MVC erstellt hat, hat große Anstrengungen unternommen, um die drei Bereiche Modell, Ansicht und Controller stark zu typisieren.

Ich bin mir nicht sicher, ob Ruby-on-Rails dies hat, aber ich würde es hoffen.

2

Nachdem Sie beide verwendet haben, lautet die Antwort IMO, dass ASP.NET MVC flexibler ist als Rails, wenn Ihre Anwendung mehr als nur Lesen/Schreiben aus einer Datenbank ausführen muss. Nach meiner Erfahrung bricht Rails schnell und stark zusammen, sobald Sie der Anwendung irgendeine Komplexität oder Logik hinzufügen, die über die sehr triviale CRUD-Logik hinausgeht. ASP.NET MVC stößt nicht auf diese Einschränkung, da es mehr ist "offen" darüber, was Sie tun können.

Wenn alles andere in einer typischen "Web 2.0" -CRUD-App gleich ist, kann man nichts über das andere tun, außer für eine kompliziertere Anwendung, die einen Workflow oder unterschiedliche Datenquellen benötigt oder mit einer anderen Anwendung oder etwas anderem interagiert Da kein typisches CRUD ist, kann ASP.NET viel mehr und ist nicht so restriktiv wie Rails.

2
Wayne Molina

Sie sind sich sehr ähnlich und können meistens alle "die gleichen Dinge tun", nur einige Dinge sind in einem einfacher und schwieriger als in anderen.

Ich habe ASP.NET MVC für die ursprüngliche Version verwendet und es war definitiv ein Rails Klon minus Activerecord. Also, Rails hat mit ziemlicher Sicherheit ein viel größeres Feature-Set und ein viel größeres Plugin/Gem-Ökosystem.

1
scottschulthess

Nach meiner begrenzten Erfahrung besteht der Hauptvorteil von ASP.NET MVC darin, dass es sich um eine kompilierte Sprache handelt. Auf diese Weise können Sie einige Programmierfehler erkennen, die bereits bei der Kompilierung aufgetreten sind, wobei Ruby muss sich darauf verlassen, dass sie dann während des Komponententests erkannt werden.

Die Tatsache, dass es kompiliert wird, ermöglicht auch erweiterte Refactoring-Tools, z. Ändern Sie den Namen einer Eigenschaft an einer Stelle, und alle Verweise auf die Eigenschaft werden geändert. Dies ist zumindest in TextMate nicht möglich, was viele Rails Entwickler) verwenden.

Andererseits ist der Hauptvorteil von Ruby on Rails), dass es sich um eine interpretierte Sprache handelt;) Die Natur von Ruby, wie Sie jedes Objekt ändern können im Speicher oder Affen-Patch einer Klasse kann zu einigen sehr eleganten Lösungen führen, siehe das Buch Eloquent Ruby für einige Beispiele. Und ein Großteil der Rails Das Framework selbst basiert auf dieser Fähigkeit.

Die Möglichkeit, jede Methode an jedem Objekt jederzeit zu ersetzen, hat mir auch beim Schreiben von Komponententests sehr geholfen. In .NET sind Dependency Injection und IOC Container) praktisch Voraussetzungen für die Erstellung von testbarem Code. Dies ist in Ruby nicht erforderlich.

Bearbeiten:

Nachdem Sie darüber nachgedacht haben, ist wahrscheinlich die Killer-Funktion von Rails die Datenbankmigration. Das ASP.NET MVC-Framework bietet an sich keine Datenbankunterstützung. Das .NET-Framework verfügt über einige Datenzugriffskomponenten/ORM, z. B. Entity Framework und Linq to Sql. Es gibt jedoch keine Tools zum Entwerfen der Datenbankstruktur.

Wenn Sie für eine der teureren Versionen von VS bezahlen, erhalten Sie Data Dude , mit dem Sie ein Datenbankschema entwerfen können, und einige Tools zum Bereitstellen des Schemas in einer Datenbank. Soweit ich das beurteilen kann, ist die Unterstützung für die Verarbeitung von Migrationen aus früheren Versionen der Anwendung sehr begrenzt.

Einige behaupten, dass ASP.NET MVC nicht wirklich ein MVC-Framework ist, sondern lediglich ein VC Framework), da die Datenbankmigration nicht unterstützt wird.

Bearbeiten (erneut):

Änderungen an der Visual Studio-Toolchain/EF haben seit meiner letzten Bearbeitung codebasierte Migrationen eingeführt. (Schauen Sie sich aber auch FluentMigrator an, wenn Sie diesen Weg gehen.)

1
Pete