Konfigurieren von JsonNetSerializer und JsonNetBodyDeserializer mit Nancy TinyIoC

8

Ich bin ein Neuling für Nancy. Ich habe es als Framework verwendet, um eine REST-API zu erstellen. Ich bin mit Json.NET vertraut, also habe ich mit dem Nancy.Serialization.JsonNet -Paket gespielt.

Mein Ziel: Anpassen des Verhaltens (d. h. Ändern der Einstellungen) von JsonNetSerializer und JsonNetBodyDeserializer .

Speziell möchte ich die folgenden Einstellungen einbauen ...

%Vor%

Ich wollte diese Anpassung mithilfe des integrierten TinyIoC-Containers durchführen, um die Vererbungskette zu vermeiden und mögliche Probleme aufgrund von Änderungen im Paket Nancy.Serialization.JsonNet zu begrenzen.

HINWEIS: Als temporäre Problemumgehung habe ich die Vererbung genutzt, um CustomJsonNetSerializer und CustomJsonNetBodyDeserializer zu erstellen.

Ich habe mehrere Ansätze versucht, diese Konfiguration zumindest für die JsonNetSerializer einzubauen. Ich habe noch nicht probiert, den JsonNetBodyDeserializer mit TinyIoC zu konfigurieren. Ich stelle mir vor, dass es ähnlich gemacht wird. Die ganze Arbeit, die ich versucht habe, ist in meinem CustomNancyBootstrapper (das von DefaultNancyBootstrapper erbt).

Bisher erfolgreichster Ansatz: override ConfigureApplicationContainer

%Vor%

Ich habe den Code verfolgt und den JsonNetSerializer(JsonSerializer serializer) -Konstruktor im JsonNet-Paket beobachtet.

Mögliches Problem: Ich habe bemerkt, dass der Konstruktor zweimal aufgerufen wird. Ich habe dieses Verhalten nicht erwartet.

Das erste Mal, dass alles stimmt - meine Anpassung wird hinzugefügt und ordnungsgemäß registriert. Aber dann passiert das zweite Mal und die Typen werden neu registriert, ohne die Einstellungen anzupassen. Die Neuregistrierung scheint die ursprüngliche Registrierung zu ersetzen und die Einstellungen meiner Einstellungen zu verlieren.

Der Aufruf-Stack beim zweiten Aufruf des Konstruktors zeigt, dass er während GetEngine und GetEngineInternal aufgerufen wird, was anscheinend versucht, ein NancyEngine zu erstellen (ich benutze das self-host-Paket, so dass dies im Programm passiert) .cs - using(var host = new NancyHost(uri)) ).

Scheint so, als müsste ich entweder Nancy sagen, dass sie etwas nicht tun soll, oder ich muss mich in einen späteren Teil der Kette einklinken.

Jede Hilfe wäre willkommen.

    
Rob 21.07.2014, 19:31
quelle

1 Antwort

15

Normalerweise ist die Lösung in Nancy die Implementierung eines eigenen JSON-Serializers:

%Vor%

Hier können Sie alle Einstellungen überschreiben.

Dann können Sie es registrieren, indem Sie IRegistrations

verwenden %Vor%

F: Wie unterscheidet sich dieser Ansatz von der Erstellung von CustomJsonNetSerializer, der von JsonNetSerializer erbt und dann in ConfigureApplicationContainer registriert wird (container.Register (typeof (JsonNetSerializer), typeof (CustomJsonNetSerializer))?

A: Der JsonSerializer ist die Implementierung wenn json.net für Nancy, das ist die empfohlene Methode, die wir auf der Readme-Datei auf github definieren:

Ссылка

Die Klasse, die Sie erwähnen, ist die Serialisierung eines Objekts zu JSON, dort ist eine andere, die Deserialisierung behandelt, die beide JsonSerializer intern verwenden:

Ссылка

Bei Verwendung dieser Methode werden die Implementierungseinstellungen überall dort konsistent, wo der JsonSerializer verwendet wird.

F: kann ich aus dem von Ihnen skizzierten Ansatz schließen, dass ich CustomJsonSerializer in der ConfigureApplicationContainer-Überschreibung in meinem CustomNancyBootstrapper nicht mehr explizit registrieren muss?

A: Die Methode, die ich für die Registrierung verwendet habe, ist nur eine sauberere Abstraktion zum Registrieren von Abhängigkeiten. Anstatt einen riesigen Bootstrapper zu erstellen, können Sie einige kleinere spezifische Klassen erstellen.

Ja, wenn Sie meine Methode verwenden, müssen Sie sich nicht im Bootstrapper registrieren.

    
Phill 22.07.2014, 07:24
quelle

Tags und Links