From 6a85855fbba3f8c07c9ce262741c9b62b96177b0 Mon Sep 17 00:00:00 2001 From: Marlon Regenhardt Date: Thu, 20 Feb 2020 19:47:49 +0100 Subject: [PATCH] [Blazor][Wasm] Move HttpClient from default services to Program.Main (#19119) * [Blazor][Wasm] Move HttpClient from default services to extension method (#16929) * Apply suggestions from code review Co-authored-by: Steve Sanderson --- .../src/Hosting/WebAssemblyHostBuilder.cs | 9 ------ .../HttpClientServiceCollectionExtensions.cs | 31 +++++++++++++++++++ .../Hosting/WebAssemblyHostBuilderTest.cs | 1 - .../testassets/StandaloneApp/Program.cs | 2 ++ .../test/testassets/BasicTestApp/Program.cs | 1 + .../Client/Program.cs | 4 +-- 6 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 src/Components/WebAssembly/WebAssembly/src/Services/HttpClientServiceCollectionExtensions.cs diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs index 9583e43699..bf0275ea95 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs @@ -98,15 +98,6 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting Services.AddSingleton(WebAssemblyNavigationInterception.Instance); Services.AddSingleton(); Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(WebAssemblyConsoleLogger<>))); - Services.AddSingleton(s => - { - // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it. - var navigationManager = s.GetRequiredService(); - return new HttpClient - { - BaseAddress = new Uri(navigationManager.BaseUri) - }; - }); } } } diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/HttpClientServiceCollectionExtensions.cs b/src/Components/WebAssembly/WebAssembly/src/Services/HttpClientServiceCollectionExtensions.cs new file mode 100644 index 0000000000..a4c8118e3f --- /dev/null +++ b/src/Components/WebAssembly/WebAssembly/src/Services/HttpClientServiceCollectionExtensions.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Net.Http; +using Microsoft.AspNetCore.Components; + +namespace Microsoft.Extensions.DependencyInjection +{ + public static class HttpClientServiceCollectionExtensions + { + /// + /// Adds a instance to the that is + /// configured to use the application's base address (). + /// + /// The . + /// The configured . + public static IServiceCollection AddBaseAddressHttpClient(this IServiceCollection serviceCollection) + { + return serviceCollection.AddSingleton(s => + { + // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it. + var navigationManager = s.GetRequiredService(); + return new HttpClient + { + BaseAddress = new Uri(navigationManager.BaseUri) + }; + }); + } + } +} diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyHostBuilderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyHostBuilderTest.cs index b3ede8c030..13465b8493 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyHostBuilderTest.cs +++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyHostBuilderTest.cs @@ -80,7 +80,6 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting typeof(NavigationManager), typeof(INavigationInterception), typeof(ILoggerFactory), - typeof(HttpClient), typeof(ILogger<>), }; } diff --git a/src/Components/WebAssembly/testassets/StandaloneApp/Program.cs b/src/Components/WebAssembly/testassets/StandaloneApp/Program.cs index 4b62ad89ee..ff12347ed0 100644 --- a/src/Components/WebAssembly/testassets/StandaloneApp/Program.cs +++ b/src/Components/WebAssembly/testassets/StandaloneApp/Program.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.DependencyInjection; namespace StandaloneApp { @@ -12,6 +13,7 @@ namespace StandaloneApp { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add("app"); + builder.Services.AddBaseAddressHttpClient(); await builder.Build().RunAsync(); } diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs index b9cd628669..f72c504d8d 100644 --- a/src/Components/test/testassets/BasicTestApp/Program.cs +++ b/src/Components/test/testassets/BasicTestApp/Program.cs @@ -34,6 +34,7 @@ namespace BasicTestApp builder.RootComponents.Add("root"); + builder.Services.AddBaseAddressHttpClient(); builder.Services.AddSingleton(); builder.Services.AddAuthorizationCore(options => { diff --git a/src/ProjectTemplates/ComponentsWebAssembly.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.cs b/src/ProjectTemplates/ComponentsWebAssembly.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.cs index cc21291973..5a277e40ef 100644 --- a/src/ProjectTemplates/ComponentsWebAssembly.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.cs +++ b/src/ProjectTemplates/ComponentsWebAssembly.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Text; @@ -18,7 +18,7 @@ namespace ComponentsWebAssembly_CSharp var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add("app"); - // use builder.Services to configure application services. + builder.Services.AddBaseAddressHttpClient(); #if (IndividualLocalAuth) #if (Hosted) builder.Services.AddApiAuthorization();