private static void ConfigureDynamics(IServiceCollection services, ProjectConfiguration project, ProjectResource projectResource, Serilog.ILogger logger) { Debug.Assert(services != null, "Required ServiceCollection is null"); Debug.Assert(project != null, "Required ProjectConfiguration is null"); Debug.Assert(projectResource != null, "Required ProjectResource is null"); Debug.Assert(projectResource.Type == ProjectType.Dynamics, "Project type must be Dynamics"); // the projectResourceKey convention is repeated also in OAuthClientFactory which gets the HttpClient using the same convention, // // {Id}-dynamics-authorization // string projectResourceKey = project.Id + "-dynamics"; // add authorization HttpClient services.AddHttpClient(projectResourceKey + "-authorization", configure => configure.BaseAddress = projectResource.AuthorizationUri) ; // add odata HttpClient // note: I do not like this IoC anti-pattern where we are using the service locator directly, however, // there are many named dependencies. There may be an opportunity to address this in the future var builder = services.AddHttpClient(projectResourceKey, configure => { configure.BaseAddress = projectResource.Resource; }) .AddHttpMessageHandler(serviceProvider => { // build the token service that talk to the OAuth endpoint IOAuthClientFactory oauthClientFactory = serviceProvider.GetRequiredService <IOAuthClientFactory>(); IOAuthClient client = oauthClientFactory.Create(project); ITokenCache <OAuthOptions, Token> tokenCache = serviceProvider.GetRequiredService <ITokenCache <OAuthOptions, Token> >(); ITokenService tokenService = new OAuthTokenService(client, tokenCache); var handler = new TokenAuthorizationHandler(tokenService, CreateOAuthOptions(projectResource)); return(handler); }); var apiGatewayHost = projectResource.ApiGatewayHost; var apiGatewayPolicy = projectResource.ApiGatewayPolicy; if (!string.IsNullOrEmpty(apiGatewayHost) && !string.IsNullOrEmpty(apiGatewayPolicy)) { // add the ApiGatewayHandler logger.Information("Using {@ApiGateway} for {Resource}", new { Host = apiGatewayHost, Policy = apiGatewayPolicy }, projectResource.Resource); builder.AddHttpMessageHandler(() => new ApiGatewayHandler(apiGatewayHost, apiGatewayPolicy)); } }
private static void ConfigureDynamics(IServiceCollection services, ProjectConfiguration project, ProjectResource projectResource, Serilog.ILogger logger) { Debug.Assert(services != null, "Required ServiceCollection is null"); Debug.Assert(project != null, "Required ProjectConfiguration is null"); Debug.Assert(projectResource != null, "Required ProjectResource is null"); Debug.Assert(projectResource.Type == ProjectType.Dynamics, "Project type must be Dynamics"); string projectResourceKey = project.Id + "-dynamics"; // add authorization HttpClient services.AddHttpClient(projectResourceKey + "-authorization", configure => configure.BaseAddress = projectResource.AuthorizationUri) ; // add odata HttpClient // note: I do not like this IoC anti-pattern where we are using the service locator directly, however, // there are many named dependencies. There may be an opportunity to address this in the future services.AddHttpClient(projectResourceKey, configure => { configure.BaseAddress = projectResource.BaseAddress; // use the API Gateway if required if (projectResource.BaseAddress.Host != projectResource.Resource.Host) { configure.DefaultRequestHeaders.Add("RouteToHost", projectResource.Resource.Host); } }) .AddHttpMessageHandler((serviceProvider) => { // build the token service that talk to the OAuth endpoint IHttpClientFactory httpClientFactory = serviceProvider.GetRequiredService <IHttpClientFactory>(); HttpClient httpClient = httpClientFactory.CreateClient(projectResourceKey + "-authorization"); // create the handler that will authenticate the call and add authorization header ILogger <OAuthClient> logger = serviceProvider.GetRequiredService <ILogger <OAuthClient> >(); ITokenCache tokenCache = serviceProvider.GetRequiredService <ITokenCache>(); ITokenService tokenService = new OAuthTokenService(new OAuthClient(httpClient, logger), tokenCache); var handler = new TokenAuthorizationHandler(tokenService, CreateOAuthOptions(projectResource)); return(handler); }); }