Ich befinde mich in einem frühen Stadium des Entwurfs eines Systems, das im Wesentlichen in zwei Teile geteilt wird. Ein Teil ist ein Dienst und der andere ist eine Schnittstelle mit dem Dienst, der Daten über OData oder XML bereitstellt. Die Anwendung basiert auf dem MVC-Architekturmuster. Für die Ansichten ziehen wir die Verwendung von XSLT oder Razor unter ASP.NET in Betracht.
XSLT oder Razor würden dazu beitragen, Bedenken zu trennen, bei denen das ursprüngliche XML oder die ursprüngliche Antwort Ihr Modell darstellt, während die XSLT- oder "Razor-Ansicht" Ihre Ansicht darstellt. Ich werde den Controller für dieses Beispiel weglassen. Der ursprüngliche Entwurfsvorschlag empfiehlt XSLT. Ich schlug jedoch die Verwendung von Razor als benutzerfreundlichere Ansichts-Engine vor.
Dies sind die Gründe, die ich für Razor (C #) vorgeschlagen habe:
- Einfachere Bearbeitung und Erstellung komplizierterer Seiten.
- Kann leicht Nicht-* ML-Ausgaben erzeugen, z. B. csv, txt, fdf
- Weniger ausführliche Vorlagen
- Das Ansichtsmodell ist stark typisiert, wobei XSLT sich auf Konventionen stützen müsste, z. B. Boolesche Werte oder Datumswerte
- Markup ist zugänglicher, z. B. nbsp, Newline-Normalisierung, Attibute-Value-Normalisierung, Whitespace-Regeln
- Der integrierte HTML-Helfer kann JS-Validierungscode basierend auf DTO-Attributen generieren
- Der integrierte HTML-Helfer kann Links zu Aktionen generieren
Und die Argumente für XSLT über Rasiermesser waren:
- XSLT ist ein Standard und wird noch viele Jahre in der Zukunft existieren.
- Es ist schwierig, versehentlich Logik in die Ansicht zu verschieben
- Easer für Nicht-Programmierer (dem ich nicht zustimme).
- Es war in einigen unserer vergangenen Projekte erfolgreich.
- Datenwerte sind standardmäßig HTML-codiert
- Immer gut geformt
Ich suche also nach Argumenten auf beiden Seiten, nach Empfehlungen oder nach Erfahrungen, die eine ähnliche Wahl treffen?
quelle
Antworten:
Ich habe XSLT erfolgreich als Webpräsentationsstufe verwendet ... im Jahr 1999. In den letzten 12 Jahren sind viel bessere Optionen hinzugekommen. Tun Sie sich selbst einen großen Gefallen und verwenden Sie Razor. Es ist ein Vergnügen.
quelle
Hier ist ein grundlegender Syntaxvergleich
Rasierer
XSLT
Die Datenquellen für die beiden Beispiele
XML
C #
quelle
name
(möglicherweise in einen anderen Modus versetzt) ein For- Each-Modell ausgeführtitem
. Obwohl dies technisch funktioniert, kann es die Stärken von XSLT nicht ausspielen. Dies sollte nicht als (persönliches) Argument heruntergespielt werden.Gibt es eine 1: 1-Beziehung zwischen HTML-Seiten und XML-Ausgabe? Betrachten Sie folgende Fälle:
Beispiel: Sie hosten eine Website mit Filmkritiken. Sie haben eine Homepage mit den neuesten Bewertungen, eine Seite pro Bewertung und eine Seite mit Kommentaren und Bewertungen der Gäste. Es gibt keinerlei Registrierung. Sie möchten es einfach machen, Ihre Website programmgesteuert zu verwenden, ohne die hässliche HTML-Analyse durchzuführen. In diesem Fall können Sie eine 1: 1-Beziehung haben: Alles, was der Mensch tun kann, kann der Bot auch: Mit denselben Anforderungen erhalten sie denselben Inhalt.
http://example.com/Movie/View/12345/The%20Adjustment%20Bureau wird von Menschen verwendet.
http://example.com/Movie/View/12345/The%20Adjustment%20Bureau?xml wird von Bots verwendet, um auf dieselben Informationen zuzugreifen.
Beispiel: Sie sind ein Schöpfer eines anderen Facebook. Es gibt eine Website und eine API. Der einzige gemeinsame Punkt ist, dass dieselbe Datenbank verwendet wird, Bots jedoch nicht auf das zugreifen können, was Personen können, und die Informationen unterschiedlich dargestellt werden.
http://example.com/MyFriends/ zeigt die zehn besten Freunde, die ich in meinem Konto habe. Durch Klicken auf "Mehr" wird eine AJAX-Anfrage gestellt, die andere Freunde anzeigt.
http://api.example.com/friends?user=MainMa&key=1DE051C6F&xml zeigt das entsprechende XML mit allen Freunden, die ich habe.
Sie können sehen, dass:
Ich empfehle, XSLT nur zu wählen, wenn Sie sich in der Nähe einer 1: 1-Beziehung befinden . In diesem Fall wird der Ansatz vereinfacht: Die Anwendung gibt jedes Mal XML aus, transformiert es jedoch manchmal mit XSLT für die Browser.
Wenn Sie diese Beziehung nicht haben, sehe ich keinen Vorteil von XSLT gegenüber Razor. Es bietet eine Trennung von Bedenken, die auch Razor bietet. Sie können HTML ändern, ohne die Website neu kompilieren zu müssen, was auch Razor zulässt.
Zu den von Ihnen aufgeführten Vorteilen:
Planen Sie eine Bewerbung, die sehr lange Bestand hat? Rasiermesser haben die Chance, in vier Jahren verwendet zu werden oder zumindest unterstützt zu werden. Die Lebensdauer der meisten Anwendungen beträgt weniger als vier Jahre.
Warte was?! Selbst Programmierer finden, dass XSLT scheiße ist, schwer zu verstehen und zu verwenden ist. Und wenn ich mit Nicht-Programmierern über XML spreche (nicht einmal in der Nähe von XSLT), weinen sie und rennen weg.
Wenn Ihr Team Razor noch nie zuvor verwendet hat, sollten Sie die Zeit berücksichtigen, die zum Erlernen erforderlich ist.
Wenn Ihr Team es verwendet hat, diese Projekte jedoch fehlgeschlagen sind, sollten Sie analysieren, warum es fehlgeschlagen ist und an Razor lag und was Sie tun können, um solche Fehler in zukünftigen Projekten zu vermeiden.
quelle
Meine Empfehlung ist Razor und der Hauptgrund ist, dass es viel einfacher ist, damit zu arbeiten (als mit XSLT, und im Gegensatz zu Ihrem aufgezählten Argument für XSLT sind Sie jedoch auf meiner Seite). Ich habe Erfahrung in der Arbeit mit beiden und Razor wird außerordentlich leistungsfähig bei bedingten Anweisungen, deklarativen Helfern (Funktionen im Prinzip), Verzweigungen, Schleifen usw.
Vergessen wir nicht, dass Razor eine Programmiersprache ist (ja, eine Template-Engine oder View-Engine, die jedoch über eine Programmiersprache wie C # oder VB.NET implementiert ist), während XSLT eher eine Markup-Struktur aufweist.
Ich denke, Ihr Szenario ist wie der Versuch, C # oder T-SQL auszuwählen, um eine komplexe Geschäftsanwendung zu schreiben. Während T-SQL in festgelegten Operationen ziemlich leistungsfähig ist, bricht es einfach ab, wenn Sie versuchen, Logik (if-else, switch, for usw.) darin zu implementieren.
quelle
Sie müssen sich nicht entscheiden, Sie können beide verwenden. In ASP.NET MVC können Sie mehrere Ansichtsmodule gleichzeitig verwenden. In dem Projekt, an dem ich gerade arbeite, verwende ich XSLT für schreibgeschützte Ansichten und Razor für Formulare. Sie können auch XSLT mit Rasiermesser-Layout oder Rasiermesser mit XSLT-Layout verwenden. Ich verwende das XSLT-Layout, daher verwende ich einfach ein Razor-Layout, das das XSLT-Layout aufruft und die HTML-Abschnitte als Parameter übergibt:
... und in
htmlRaw.xsl
dir einfach benutzendisable-output-escaping="yes"
:Siehe Verwenden von Razor und XSLT im selben Projekt .
quelle
Ich würde vorschlagen, dass es einen dritten und besseren Weg gibt: Legen Sie zwei verschiedene dünne Frontends auf eine einzelne Service- / Anwendungsschicht, die keine Benutzeroberfläche als solche hat.
Also eher als
verwenden
und stellen Sie sicher, dass die Benutzeroberfläche und der Dienst NUR Code enthalten, der für diese Schnittstelle eindeutig ist. (Entschuldigung für die ASCII-Diagramme, das Beste, was ich jetzt tun kann)
Der Grund, warum ich über eines der von Ihnen diskutierten Designs besorgt sein würde, ist, dass es die Entwicklung der Benutzeroberfläche mit der Entwicklung des Dienstes verknüpft, wie Sie es selten tun möchten. Wenn das Unternehmen der Benutzeroberfläche eine Funktionalität hinzufügen möchte, möchten Sie nicht gezwungen werden, diesen Dienst zu schreiben, bevor Sie dies tun können. Sie möchten den Benutzeroberflächenteil schreiben und dann, sofern dies im Dienst erforderlich ist, den Code dort wiederverwenden.
Schlimmer noch, wenn das Unternehmen Daten für den Endbenutzer ganz anders anzeigen möchte als für einen mechanischen Benutzer über den Dienst (was sehr wahrscheinlich ist), müssen Sie damit beginnen, komplexen Code in XSLT oder XSLT einzufügen Erstellen Sie eine zweite Service-Schicht (oder schlimmer noch Fat Controller) über Ihrem Service, um die Präsentation für den Benutzer darzustellen.
Denken Sie in diesem Fall an die Validierung. Sie zeichnen möglicherweise drei Vertrauensstufen. Ihr Modell muss überprüft werden, um sicherzustellen, dass Sie keine ungültigen Daten speichern. In diesem Fall erfordert Ihr Service möglicherweise eine weitere Validierung, um sicherzustellen, dass externe Verbraucher nicht versuchen, etwas zu tun, was sie nicht tun dürfen. und Ihre Benutzeroberfläche benötigt bestenfalls einige Validierungsregeln, damit ein Postback vermieden werden kann.
Und dies ist, bevor wir überhaupt die schwierige Situation von etwas berühren, das nicht über die API zugelassen werden sollte, sondern über die Benutzeroberfläche, für die die API erforderlich ist.
Ich habe ein Argument gehört, dass das Ausführen Ihrer Benutzeroberfläche durch Ihren Dienst Hundefutter ist und daher gut für die Qualität des Dienstes ist, aber ich empfehle nachdrücklich, dass es bessere Möglichkeiten gibt, dies zu tun, während eine solide (und feste) Trennung der Bedenken zwischen dem Dienst beibehalten wird. die Benutzeroberfläche und das Geschäftsmodell.
Wenn Sie Ihren Service mit einer Benutzeroberfläche ausstatten müssen, würde ich Razor dringend gegenüber XSLT empfehlen.
XSLT ist ein Standard, ja. XSLT 2.0 wird jedoch nur eingeschränkt unterstützt, sodass Sie an einem veralteten Standard festhalten, wenn Sie dieses Argument vorbringen möchten.
XSLT ist nicht leicht zu lesen. Von jedem, der kein XSLT-Experte ist. Wer ist Ihrer Meinung nach leichter zu finden, wenn Sie neue Mitarbeiter einstellen müssen? Jemand, der behauptet, ein XSLT-Experte oder ein ASP.NET for MVC-Experte zu sein?
Und ja, ich habe gesehen, dass XSLT erfolgreich verwendet wurde, aber nur bevor MVC für ASP.NET eine Option war.
quelle