2016-08-09 100 views
0

Ich richte eine neue Webanwendung ein. Wir haben Dienste, die kontinuierliche Hintergrundoperationen durchführen (CQRS-Projektionen), weshalb wir sie in Windows-Diensten hosten. Wir möchten diese Dienste auch dazu verwenden, die entsprechenden Web-APIs zu hosten (andernfalls könnten wir keine In-Memory-Projektionen bereitstellen).Bereiche in der selbst gehosteten (OWIN) Web-API

Darüber hinaus möchten wir SignalR-Unterstützung haben, um die Kunden zu informieren, wenn eine Projektion aktualisiert wurde. Wir haben eine separate ASP.NET MVC-Anwendung, da wir Razor-Ansichten für das Templating verwenden.

Wir möchten die Web-API in mehrere Bereiche aufteilen - ähnlich wie es in einer ASP.NET (MVC) -Anwendung möglich ist - mit einem Bereich pro begrenztem Kontext. Wie http://localhost:8080/Orders/api/{Controller}/{id} oder

Zu einem späteren Zeitpunkt möchten wir auch die Controller, Projektionen, Modelle usw. in separaten Baugruppen haben. Wieder pro Kontext

Ist es möglich, Bereiche in einem selbst gehosteten Web-API-Projekt zu definieren? Wäre es vielleicht möglich, sie zu Controllern bestimmter Baugruppen zu leiten?

Antwort

0

Dank dem Artikel in https://blogs.msdn.microsoft.com/webdev/2013/03/07/asp-net-web-api-using-namespaces-to-version-web-apis/ habe ich es gelöst.

Ich habe meine eigenen IHttpControllerSelector implementieren und den Standard einen in Startup.cs wie so ersetzen:

/// <summary> 
/// OWIN startup class 
/// </summary> 
public class Startup 
{ 
    /// <summary> 
    /// Owin configuration 
    /// </summary> 
    /// <param name="app">App builder</param> 
    public void Configuration(IAppBuilder app) 
    { 
     // We might have to resolve the referenced assemblies here or else we won't find them. This is a quick and dirty way to make sure that the assembly containing the controller has been loaded 

     var x = typeof(CarRental.Reservations.Application.Read.Web.FooController); 

     // Configure Web API for self-host. 
     var config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{boundedcontext}/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     // Enable routing via bounded context 
     config.Services.Replace(typeof(IHttpControllerSelector), new BoundedContextControllerSelector(config)); 

     app.UseWebApi(config); 

     // Configure SignalR 
     app.UseCors(CorsOptions.AllowAll); 
     app.MapSignalR(); 
    } 
} 

Mit BoundedContextControllerSelector ist eine Implementierung von IHttpControllerSelector in unmittelbarer Nähe des Code im Beispiel: https://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs

I Verwenden Sie den Namespace, um den beschränkten Kontext zu bestimmen, und haben Sie jetzt eine klare Trennung der Web-API-Endpunkte für jeden Kontext :)