/// <summary> /// Instructs WebApi to map one or more of the registered Restier APIs to the specified Routes, each with it's own isolated Dependency Injection container. /// </summary> /// <param name="config">The <see cref="HttpConfiguration"/> instance to enhance.</param> /// <param name="configureRoutesAction">The action for configuring a set of routes.</param> /// <param name="httpServer">The HttpServer instance to create the routes on.</param> /// <returns>The <see cref="HttpConfiguration"/> instance to allow for fluent method chaining.</returns> /// <example> /// <code> /// config.MapRestier(builder => /// builder /// .MapApiRoute<SomeApi>("SomeApiV1", "someapi/") /// .MapApiRoute<AnotherApi>("AnotherApiV1", "anotherapi/") /// ); /// </code> /// </example> public static HttpConfiguration MapRestier(this HttpConfiguration config, Action <RestierRouteBuilder> configureRoutesAction, HttpServer httpServer) { Ensure.NotNull(configureRoutesAction, nameof(configureRoutesAction)); var rrb = new RestierRouteBuilder(); configureRoutesAction.Invoke(rrb); foreach (var route in rrb.Routes) { ODataBatchHandler batchHandler = null; var conventions = CreateRestierRoutingConventions(config, route.Key); if (route.Value.AllowBatching) { if (httpServer == null) { throw new ArgumentNullException(nameof(httpServer), OwinException); } #pragma warning disable IDE0067 // Dispose objects before losing scope batchHandler = new RestierBatchHandler(httpServer) { ODataRouteName = route.Key }; #pragma warning restore IDE0067 // Dispose objects before losing scope } var odataRoute = config.MapODataServiceRoute(route.Key, route.Value.RoutePrefix, (containerBuilder, routeName) => { var rcb = containerBuilder as RestierContainerBuilder; rcb.routeBuilder = rrb; rcb.RouteName = routeName; containerBuilder.AddService <IEnumerable <IODataRoutingConvention> >(ServiceLifetime.Singleton, sp => conventions); if (batchHandler != null) { //RWM: DO NOT simplify this generic signature. It HAS to stay this way, otherwise the code breaks. containerBuilder.AddService <ODataBatchHandler>(ServiceLifetime.Singleton, sp => batchHandler); } }); } return(config); }
/// <summary> /// Instructs WebApi to map one or more of the registered Restier APIs to the specified Routes, each with it's own isolated Dependency Injection container. /// </summary> /// <param name="routeBuilder">The <see cref="HttpConfiguration"/> instance to enhance.</param> /// <param name="configureRoutesAction">The action for configuring a set of routes.</param> /// <returns>The <see cref="HttpConfiguration"/> instance to allow for fluent method chaining.</returns> /// <example> /// <code> /// config.MapRestier(builder => /// builder /// .MapApiRoute<SomeApi>("SomeApiV1", "someapi/") /// .MapApiRoute<AnotherApi>("AnotherApiV1", "anotherapi/") /// ); /// </code> /// </example> public static IRouteBuilder MapRestier(this IRouteBuilder routeBuilder, Action <RestierRouteBuilder> configureRoutesAction) { Ensure.NotNull(routeBuilder, nameof(routeBuilder)); Ensure.NotNull(configureRoutesAction, nameof(configureRoutesAction)); var perRouteContainer = routeBuilder.ServiceProvider.GetRequiredService <IPerRouteContainer>(); perRouteContainer.BuilderFactory = () => routeBuilder.ServiceProvider.GetRequiredService <IContainerBuilder>(); var rrb = new RestierRouteBuilder(); configureRoutesAction.Invoke(rrb); foreach (var route in rrb.Routes) { ODataBatchHandler batchHandler = null; if (route.Value.AllowBatching) { #pragma warning disable IDE0067 // Dispose objects before losing scope batchHandler = new RestierBatchHandler() { ODataRouteName = route.Key }; #pragma warning restore IDE0067 // Dispose objects before losing scope } var odataRoute = routeBuilder.MapODataServiceRoute(route.Key, route.Value.RoutePrefix, (containerBuilder) => { var rcb = containerBuilder as RestierContainerBuilder; rcb.routeBuilder = rrb; rcb.RouteName = route.Key; containerBuilder.AddService <IEnumerable <IODataRoutingConvention> >(OData.ServiceLifetime.Singleton, sp => routeBuilder.CreateRestierRoutingConventions(route.Key)); if (batchHandler != null) { //RWM: DO NOT simplify this generic signature. It HAS to stay this way, otherwise the code breaks. containerBuilder.AddService <ODataBatchHandler>(OData.ServiceLifetime.Singleton, sp => batchHandler); } }); } return(routeBuilder); }