2016-11-02 2 views
0

Wir haben eine Situation, in der unsere App eine Reihe von Modulen hat, die eine API implementieren. Jedes dieser Module hat eine Abhängigkeit, die wiederum davon abhängt, dass ein Datenverzeichnispfad ordnungsgemäß konfiguriert ist. Diese Module sollten erst aufgebaut werden, wenn dieser Pfad konfiguriert ist.Dynamische Registrierung und Aufhebung der Registrierung Nancy Routen/Module

Wir haben auch ein Modul, das die Einstellung und Validierung der Konfiguration implementiert, einschließlich der Konfiguration des oben genannten Pfades.

Wir möchten die Datenmodule irgendwie "deaktivieren", bis die Konfiguration bestätigt werden kann. Die Konfiguration wird bestätigt, indem wir beispielsweise beim Start prüfen, ob das Datenverzeichnis existiert und gültig ist. Wenn ein Benutzer Änderungen über das Konfigurationsmodul speichert, würden wir diese Bestätigung erneut durchführen. Zur Erinnerung: Der Benutzer legt das Datenverzeichnis fest und alle Datenmodule werden aktiviert. Wenn der Benutzer ein ungültiges Datenverzeichnis einstellt (oder wir starten und das vorhandene ungültig ist), werden alle Module deaktiviert.

Wir haben versucht, einen Handler auf der pipelines.BeforeRequest zu registrieren, aber es hat nicht geholfen. Wir versagen tatsächlich viel früher, wenn Nancy unsere Module als Teil der Besetzung einer RouteCache instanziiert. Wir müssen diese Instanziierung verhindern, bis wir bestätigen können, dass wir konfiguriert sind.

Es scheint so, als müssten wir in der Lage sein zu sagen: "Verwenden Sie diese Modulgruppe, wenn eine Bedingung erfüllt ist, und verwenden Sie diese andere Gruppe, wenn die Bedingung falsch ist." Wie geht man so in Nancy vor?

Antwort

0

Wenn alle diese Module, die Sie beziehen die gleiche API (dh definieren den gleichen Satz von Method + Pattern + Action Handler) implementieren, dann sollten Sie vielleicht nur ein Modul verwenden, um die Anforderungen für alle von ihnen zu handhaben, und verwenden ein Erfassen Sie die Segmentvariable (z. B. "/{path}/api/operation/") in Ihrem Modulmuster, um festzustellen, auf welchen Pfad (dh Datenverzeichnis) Sie sich beziehen.

Dann können Sie im Hauptteil der Aktion überprüfen, ob die von Ihnen benötigten Bedingungen erfüllt sind. Etwas wie folgt aus:

Get["/app/{directory}/api/status"] = parameters => { 
    var dataDirectory = parameters.directory; 
    // Do whatever condition checks you need with the dataDirectory value 
    // and return the appropriate HTTP status code if they are not met, 
    // otherwise continue handling the request 
    return HttpStatus.OK; 
} 

Ein anderer Ansatz (wieder, wenn mit einem einzigen Modul alle diese Anforderungen zu verarbeiten) würde einen Parameter individuelle Route Einschränkung zu verwenden (siehe https://github.com/NancyFx/Nancy/wiki/Defining-routes#custom-constraints). In diesem Fall, wenn Ihre Bedingungen nicht erfüllt sind, wird die Route überhaupt nicht getroffen.

Verwandte Themen