我正在设置一个新的Web应用程序。我们有服务执行连续的后台操作(CQRS预测),这就是我们在Windows服务中托管它们的原因。我们也希望使用这些服务来托管相应的Web API(否则我们无法提供内存中的预测)。
此外,我们希望SignalR支持在更新投影时通知客户。我们有一个单独的ASP.NET MVC应用程序,因为我们使用Razor视图进行模板化。
我们希望将Web API分成几个区域 - 类似于它在ASP.NET(MVC)应用程序中的可行方式 - 每个有界上下文都有一个区域。例如http://localhost:8080/Orders/api/{Controller}/{id}
或http://localhost:8080/Foo/api/{Controller}/{id}
稍后我们还希望将控制器,投影,模型等放在不同的组件中。同样,每个上下文一个
是否可以在自托管Web API项目中定义区域?是否可以将它们路由到特定组件的控制器?
答案 0 :(得分:1)
感谢https://blogs.msdn.microsoft.com/webdev/2013/03/07/asp-net-web-api-using-namespaces-to-version-web-apis/中的文章,我已经解决了这个问题。
我必须实现自己的IHttpControllerSelector
并替换Startup.cs
中的默认值,如下所示:
/// <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();
}
}
BoundedContextControllerSelector
是IHttpControllerSelector
的实现,非常接近示例中的代码:https://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs
我使用命名空间来确定有界上下文,现在每个上下文都清楚地分离了web api端点:)