2016-05-31 38 views
1

Wenn schaffen wir ein Modul in einem NancyFX App, wir Routing auf diese Weise:Routenname vereinbarungs oder Modulnamen in NancyFX

public class HappyModule : Nancy.NancyModule 
{ 
    public HappyModule() : base("/Happy") 
    { 
     Get["/"] = _ => "Received GET request"; 
    } 
} 

Wenn wir also http://<host>:<port>/Happy/ schlagen wir die erwartete Antwort erhalten. Ich denke jedoch, dass das Festcodieren von Routen nicht "sehr wartungsfreundlich" ist (besonders bei großen Systemen), also stellt sich die Frage: Gibt es eine Möglichkeit, eine Konvention oder etwas festzulegen, die Routen durch ihre jeweiligen Namen benennt? Modulname, so muss ich nicht immer die Basis NancyModule Konstruktor erweitern/hard-code Route?

Was ich wirklich wissen möchte ist: Gibt es einen Routing-Mechanismus ähnlich dem, den wir in ASP.NET WebApi (Code unten) haben?

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 

     ); 
    } 
+1

an den docs Blick scheint dies nicht möglich https://github.com/NancyFx/Nancy/wiki/Definieren von Routen. –

Antwort

2

Die kurze Antwort auf Ihre Frage, nein. Wir unterstützen keine Routenkonventionen in Nancy.


In meiner persönlichen Erfahrung, jedes Projekt, das ich auf die ich gearbeitet habe habe von den Konventionen in MVC schwankte und schließlich Attribut Routing verwenden. Die Konventionen bringen dich nur so weit, bevor du "wartest, wie komme ich wieder auf diese Route?"

Dann durchsuchen Sie Dateien und versuchen herauszufinden, wo die Route registriert ist.

APIs sollten einmal definiert werden und müssen selten geändert werden. Die Definition der Route in der Nähe der Implementierung stellt sicher, dass Sie Dinge leicht finden können.

Der Basispfad ermöglicht es Ihnen jedoch, Bereiche einer Site zu definieren. Zum Beispiel, anstatt /admin überall zu schreiben, könnten Sie ein abstraktes Modul für den Admin-Bereich definieren.

public abstract class AdminModule : NancyModule 
{ 
    public AdminModule() : base("/admin"){} 
    public AdminModule(string path) : base("/admin/" + path.TrimStart('/')){} 
} 

So etwas wie dies, in dem all Admin-Module von diesem erbt alle Wege, um sicherzustellen, mit dem Präfix /admin

+0

Ich bin gespannt, was das Verhalten ist, wenn diese AdminModule-Basisklasse eine Route definiert und eine Unterklasse diese Route überschreibt - wenn diese Route erreicht wird, wird der Handler immer die Unterklasse sein? – riqitang