📄 ServiceCollectionExtensions.cs
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using MSearch.Domain;
using SpotifyAPI.Web;
using SpotifyAPI.Web.Http;

namespace MSearch.SearchProviders.Spotify;

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddSpotifySearchProvider(this IServiceCollection services)
    {
        services.AddOptions<SpotifyOptions>().BindConfiguration("SearchProviders:Spotify").ValidateOnStart();
        services.AddTransient<IValidateOptions<SpotifyOptions>, SpotifyOptionsValidator>();

        services.AddHttpClient<ISpotifyClient, SpotifyClient>(
            nameof(SpotifyClient),
            (httpClient, sp) =>
            {
                var options = sp.GetRequiredService<IOptions<SpotifyOptions>>();
                var config = SpotifyClientConfig
                    .CreateDefault()
                    .WithHTTPClient(new NetHttpClient(httpClient))
                    .WithAuthenticator(
                        new ClientCredentialsAuthenticator(options.Value.ClientId, options.Value.ClientSecret)
                    );
                return new SpotifyClient(config);
            }
        );

        services.AddTransient<ISearchProvider, SpotifySearchProvider>();

        return services;
    }
}