All Downloads are FREE. Search and download functionalities are using the official Maven repository.

csharp.libraries.generichost.IServiceCollectionExtensions.mustache Maven / Gradle / Ivy

There is a newer version: 7.9.0
Show newest version
{{>partial_header}}
{{#nrt}}
#nullable enable

{{/nrt}}
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using {{packageName}}.{{clientPackage}};

namespace {{packageName}}.Extensions
{
    /// 
    /// Extension methods for IServiceCollection
    /// 
    {{>visibility}} static class IServiceCollectionExtensions
    {
        {{^hasAuthMethods}}
        /// 
        /// Add the api to your host builder.
        /// 
        /// 
        public static void Add{{apiName}}(this IServiceCollection services)
        {
            HostConfiguration config = new{{^net70OrLater}} HostConfiguration{{/net70OrLater}}(services);
            Add{{apiName}}(services, config);
        }

        {{/hasAuthMethods}}
        /// 
        /// Add the api to your host builder.
        /// 
        /// 
        /// 
        public static void Add{{apiName}}(this IServiceCollection services, Action options)
        {
            HostConfiguration config = new{{^net70OrLater}} HostConfiguration{{/net70OrLater}}(services);
            options(config);
            Add{{apiName}}(services, config);
        }

        internal static void Add{{apiName}}(IServiceCollection services, HostConfiguration host)
        {
            if (!host.HttpClientsAdded)
                host.Add{{apiName}}HttpClients();

            services.AddSingleton();

            // ensure that a token provider was provided for this token type
            // if not, default to RateLimitProvider
            var containerServices = services.Where(s => s.ServiceType.IsGenericType &&
                s.ServiceType.GetGenericTypeDefinition().IsAssignableFrom(typeof(TokenContainer<>))).ToArray();

            foreach(var containerService in containerServices)
            {
                var tokenType = containerService.ServiceType.GenericTypeArguments[0];

                var provider = services.FirstOrDefault(s => s.ServiceType.IsAssignableFrom(typeof(TokenProvider<>).MakeGenericType(tokenType)));

                if (provider == null)
                {
                    services.AddSingleton(typeof(RateLimitProvider<>).MakeGenericType(tokenType));
                    services.AddSingleton(typeof(TokenProvider<>).MakeGenericType(tokenType), 
                        s => s.GetRequiredService(typeof(RateLimitProvider<>).MakeGenericType(tokenType)));
                }
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy