2014-07-24 10 views
9

In der Einrichtung Owin meine Windows-Service-Anwendung auf Selbst Host mit basierend auf diesem Artikel:WebApp.Start <TStartup> Methode Typ Parameter

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

ich diese Überlastung der WebApp.Start Methode verwendet:

WebApp.Start Method (String)

Hier ist mein Code:

//(in startup method) 
_server = WebApp.Start<Startup>(BaseAddress); 

public class Startup 
{ 
    // This code configures Web API. The Startup class is specified as a type 
    // parameter in the WebApp.Start method. 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     // Configure Web API for self-host. 
     var config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new 
     { 
      id = RouteParameter.Optional 
     }); 

     appBuilder.UseWebApi(config); 
    } 
} 

Es funktioniert gut, also keine Beschwerden.

Aber was genau sind die Anforderungen des Typparameters der Startmethode? Es scheint keine Einschränkungen zu geben, und ich konnte keine Dokumentation darüber finden, was meine Optionen/Anforderungen an diesem Parameter sind. Sucht es nach Methoden, die IAppBuilder als Parameter verwenden? Was passiert, wenn ich den Namen der Configuration() -Methode in etwas anderes ändere? Was, wenn ich die Methode intern mache? Gibt es andere Optionen, die ich mit dieser Klasse konfigurieren kann?

Wo ist das alles dokumentiert? Ich habe das Gefühl, ohne den oben genannten Artikel hätte ich nie herausfinden können, was ich umsetzen soll.

+0

Ich fühle mich gleich: http://StackOverflow.com/Questions/26368805/Why-the-Required-Startup-Class-Doest-Implements-an-Apate-Interface-like –

+0

Worst Case können Sie immer die Quellen lesen : http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/WebApp.cs http://katanaproject.codeplex.com/SourceControl/latest#src/Owin.Loader/DefaultLoader. cs – Tratcher

Antwort

4

Die WebApp Klasse verwendet Reflektion, um einen Zeiger auf die Configuration(IAppBuilder) Methode zu erhalten, ruft sie dann auf. Wenn die Klasse, die Sie als Argument des generischen Typs angegeben haben, keine Configuration-Methode mit den erwarteten Argumenten hat, erhalten Sie zur Laufzeit einen Fehler.

Ich stimme zu, dass dies nicht so auffindbar ist, wie wir es gerne hätten, und ich bin nicht sicher, warum die ursprünglichen Entwickler es auf diese Weise implementiert haben, anstatt eine where T: IStartup Einschränkung hinzuzufügen. Dies würde nicht nur die Dokumentation ohne Dokumentation leichter machen, sondern es dem Compiler auch ermöglicht haben, dies zur Kompilierungszeit zu überprüfen.

Der einzige Vorteil dieses Ansatzes besteht darin, dass die OWIN-Entwickler in Zukunft weitere Methoden oder Methoden mit unterschiedlichen Signaturen hinzufügen können, ohne den vorhandenen Code zu unterbrechen.

+0

selbst wenn ich 'IStartup' implementiere, kann ich immer mehr Methoden hinzufügen, sage ich nicht, aber ich könnte. Die Schnittstelle macht den Code für mich intuitiver. –

+0

Mein Punkt war, dass wenn das OWIN-Team diese Schnittstelle definierte, das OWIN-Team später neue Methoden zu dieser Schnittstellendefinition hinzufügte, dann würde Ihr Code nicht mehr kompilieren (bis Sie Implementierungen der zusätzlichen Methoden hinzugefügt haben). Schlimmer noch, wenn Sie Ihren Code in eine Assembly kompiliert und mit jemand anderem geteilt haben und sie auf eine neuere Version von OWIN mit zusätzlichen Methoden in der 'IStartup'-Schnittstelle aktualisiert haben, würde Ihr Code zur Laufzeit brechen. – bikeman868

+0

Antwort macht Sinn, aber ich könnte die Rückwärtskompatibilität als den einzigen Vorteil, der sich daraus ergibt. Wenn in der neuen Version OWIN-Spezifikation eine neue Muss-Implementierungsmethode einführt, würden wir nicht einmal über die Methode Bescheid wissen und möglicherweise Laufzeitprobleme verursachen. Für mich sind Probleme bei der Kompilierung sauberer als Laufzeitausnahmen. –