shuhelohelo’s blog

Xamarin.Forms多めです.

コンソールアプリで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);
        }
    }
}

結果は以下のようになる.

f:id:shuhelohelo:20200629033946p:plain

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();
        }
    }

ソースコード

github.com