3 Stimmen

Vermeidung der wiederholten Typdefinition für jedes Ergebnis beim Projektieren in Breeze.js

Ich frage derzeit eine Entität mit Projections ab, um das gesamte Objekt nicht zurückzugeben. Es funktioniert einwandfrei, aber wenn ich die tatsächliche Antwort vom Server anschaue, sehe ich, dass die gleiche Typdefinition für jedes einzelne Element wiederholt wird.

Zum Beispiel:

["$type":"_IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4[[System.Int32, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.String, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib],[System.Int32, mscorlib],[System.Single, mscorlib]], _IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4_IdeaBlade"

Da jedes Element im Ergebnis die gleiche Projektion für diese Abfrage teilt, gibt es eine Möglichkeit, dass Breeze die Typbeschreibung NUR EINMAL anstatt für jedes Element definiert?

Es mag nicht wie ein großes Problem erscheinen, aber wenn die Ergebnisgröße zunimmt, fangen diese Bytes an sich zu summieren. Im Moment gibt es aufgrund dieses Overheads kaum einen Unterschied zwischen der Rückgabe der projizierten Werte und der gesamten Entität selbst.

HINWEIS: Es stellt sich heraus, dass dies tatsächlich nur ein kleines Problem ist, da wir in unseren realen Umgebungen die dynamische Kompression von JSON verwenden. 200KB-Antworten werden tatsächlich zu weniger als 20KB Datenverkehr nach der Gzip-Komprimierung. Ich werde diese Frage wahrscheinlich schließen, es sei denn, jemand hat etwas hinzuzufügen, das für andere hilfreich sein könnte.

Update 18. September 2014

Ich habe beschlossen, das Problem der langen hässlichen $type-Namen in serialisierten Daten für sowohl dynamische Typen aus Projektabfragen als auch anonyme Typen, die für einen Endpunkt wie "Lookups" erstellt wurden, zu "heilen".

Es gibt ein neues Breeze Labs NuGet-Paket, "Breeze.DynamicTypeRenaming" (suchen Sie nach "Breeze Dynamic Type Renaming"). Dies fügt zwei Dateien zum "Controllers"-Ordner Ihres Web-API-Projekts hinzu. Eine ist ein CustomBreezeConfig, das Breezes Standardkonfiguration ersetzt und die Json.Net "Binder"-Einstellung mit dem neuen DynamicTypeRenamingSerializationBinder zurücksetzt; dieser Binder führt die Typnamen-Magie durch.

Installieren Sie einfach das NuGet-Paket in Ihrem Web-API-Projekt und es sollte "einfach funktionieren". In Ihrem Fall würde der $type-Wert zu "_IB_4NdB_p8LiaC3WlWHHQ_pZzrAC_plF4, Dynamic" werden.

Sehen Sie ein Beispiel dafür im "DocCode"-Beispiel.

Wie immer handelt es sich um ein Breeze Lab-Produkt, nicht Teil des Kern-Breeze-Produkts. Es wird "wie es ist" ohne Supportversprechen angeboten. Ich bin ziemlich sicher, dass es gut ist und keine nachteiligen Nebenwirkungen hat. Keine Garantien. Sie werden mich sicher informieren, wenn es ein Problem gibt.

2voto

Ward Punkte 17573

Das ist abscheulich, oder! Das ist der von C# generierte anonyme Typ. Du kannst ihn loswerden, indem du ihn in einen benutzerdefinierten DTO-Typ umwandelst.

Ich weiß nicht, ob es tatsächlich schädlich ist. Ich mag es auf jeden Fall nicht, es anzusehen.

In letzter Zeit habe ich darüber nachgedacht, einen JSON.NET IContractResolver hinzuzufügen, der solche Hässlichkeiten erkennt und in kürzere Hässlichkeiten umwandelt. Es wäre nicht schwer. Ich hatte einfach keine Zeit.

Warum schreibst du das nicht selbst und trägst zur Gemeinschaft bei? Wir wären dankbar! :-)

1voto

Pablo Romeo Punkte 11088

Die Verwendung der dynamischen Komprimierung des JSON-Ausgabens hat dies zumindest vorübergehend zu einem nichtigen Problem gemacht, da alle diese sich wiederholenden Inhalte serverseitig stark komprimiert sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X