ASP.NET Web API in Konsole hosten
Ein Kunde hatte kürzlich die Anforderung, eine bestehende ASP.NET Web API Applikation auf einem zweiten Server zu hosten, wobei der zweite Server nur ein Subset der Controllerklassen enthalten soll. Während auf dem ersten Server also über 15 API Controller gehostet werden, sollen auf dem zweiten nur deren zehn aufgeschaltet werden.
Nun hätte man natürlich die ganze Anwendung kopieren und einfach die nicht benötigten Controller entfernen können; der Kunde war aber glücklicherweise an einer sauberen Lösung interessiert. Zusätzlich steht auf dem zweiten Server kein IIS zur Verfügung, die Applikation soll in einem Windows Service gehostet werden. Und dann gibt es noch das Problem, dass der erste Server Files aus einem Azure Blob Storage bezieht, der zweite Server die Dateien jedoch selber auf dem lokalen Dateisystem verwaltet.
Lösen von Abhängigkeiten
Zuerst haben wir die Abhängigkeiten zwischen API Controllern und Services aufgelöst, indem wir den Services Interfaces verpasst und diese in einem IoC Container registriert haben. Die API Controller holen die benötigten Services in diesem Schritt noch direkt aus dem IoC Container. Die neu erstellten Interfaces haben wir in eine eigene Assembly gepackt.
Auslagern von gemeinsam verwendeten API Controllern
Als zweiter Schritt haben wir eine neue Klassenbibliothek erstellt und die gemeinsam verwendeten API Controller in diese ausgelagert. Zusätzlich haben wir die Referenzen auf den IoC Conainer entfernt, die Objekte werden nun im Konstruktor der API Controller übergeben (Dependency Injection). Somit hat diese neue Assembly nur noch eine Abhängigkeit auf die Interface-Assembly.
Web API hosten
Um die Web API Controller zu hosten ist ein Windows Service vorgesehen. Wir haben für einen ersten Test jedoch eine Konsolenanwendung erstellt, ging einfacher. Um ASP.NET Web API zu hosten, benötigt man das NuGet Packet Microsoft.AspNet.WebApi.OwinSelfHost. Nach dem Erstellen des Hosts konnten wir die gemeinsam verwendeten API Controller einbinden, was ohne Probleme funktionierte.
var uri = "http://localhost:8077/"; using (WebApp.Start(uri)) { Console.WriteLine("Started"); Console.ReadKey(); Console.WriteLine("Stopping"); }
API Controller mit IoC Container verbinden
Damit die API Controller funktionieren, muss der IoC Container noch korrekt eingebunden werden. Wir haben uns für LightInject entschieden. LightInject bietet für die Web API Integration das NuGet-Packet LightInject.WebApi an. Damit ist die Integration ein Zweizeiler:
_serviceContainer.EnableWebApi(httpConfiguration); _serviceContainer.RegisterApiControllers(httpConfiguration.GetType().Assembly);
Eine kurze Webrecherche zeigt, dass auch andere IoC Libraries entsprechende Erweiterungen anbieten, beispielsweise Autofac oder Unity. Damit die Controllers aus der referenzierten Assembly ebenfalls mit LightInject funktionieren, muss sie ebenfalls registriert werden:
_serviceContainer.RegisterApiControllers(typeof(ControllerFromExternalLibrary).Assembly);
Fazit
Mit ASP.NET Web API ist es sehr einfach, saubere Applikationen zu entwickeln. Egal ob die Dienste selbst gehostet werden oder im IIS laufen; egal in welchen Assemblies die API Controller sind, alles funktioniert einfach so, wie man es erwartet. Die einfache Integration von IoC Containern erleichtert die Arbeit zusätzlich.