コンソールアプリでASP.NET CoreのDIの仕組み(ServiceProvider)を使う(2)
当然HttpClientもDIすることができる.
前回のMicrosoft.Extensions.DependencyInjection
に加えてMicrosoft.Extensions.Http
をインストールする.
using ConsoleAspNetCoreDI.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; namespace ConsoleAspNetCoreDI { class Program { static async Task Main(string[] args) { var services = new ServiceCollection(); services.AddHttpClient("anime", c => { c.BaseAddress = new Uri("https://akiba-souken.com/anime/"); }); services.AddSingleton<IScrapingService, ScrapingService>(); var serviceProvider = services.BuildServiceProvider(); var scraper = serviceProvider.GetService<IScrapingService>(); var html = await scraper.GetHtmlString(); Console.WriteLine(html); } } }
結果は以下のようになる.
ScrapingServiceクラスは以下のようになっていて,コンストラクタの引数のIHttpClientFactoryのインスタンスがインジェクトされるので,そこからHttpClientのインスタンスを取得する.
GetHtmlStringメソッドは指定したWebページのHtmlを取得して返すだけのもの.
public interface IScrapingService { public Task<string> GetHtmlString(); } public class ScrapingService : IScrapingService { private readonly HttpClient _httpClient; public ScrapingService(IHttpClientFactory httpClientFactory) { this._httpClient = httpClientFactory.CreateClient("anime"); } public async Task<string> GetHtmlString() { var response = await _httpClient.GetAsync("summer"); return await response.Content.ReadAsStringAsync(); } }