/// <summary> /// Configures common services required by both management and delivery channel APIs. /// </summary> /// <param name="services">The service collection.</param> /// <returns>The service collection, to enable chaining.</returns> public static IServiceCollection AddCommonUserNotificationsApiServices( this IServiceCollection services) { // Monitoring - for better AppInsights integration services.AddApplicationInsightsInstrumentationTelemetry(); services.AddOpenApiJsonSerializerSettings(); // Marain services integration, allowing shorthand calls to get and validate the current tenant in operation implementations. services.AddMarainServiceConfiguration(); services.AddMarainServicesTenancy(); // Tenancy service client. services.AddSingleton(sp => { TenancyClientOptions tenancyConfiguration = sp.GetRequiredService <IConfiguration>().GetSection("TenancyClient").Get <TenancyClientOptions>(); if (tenancyConfiguration?.TenancyServiceBaseUri == default) { throw new OpenApiServiceMismatchException("Could not find a configuration value for TenancyClient:TenancyServiceBaseUri"); } return(tenancyConfiguration); }); services.AddTenantProviderServiceClient(); // Operations control client services.AddOperationsControlClient( sp => { MarainOperationsControlClientOptions operationsConfiguration = sp.GetRequiredService <IConfiguration>().GetSection("Operations").Get <MarainOperationsControlClientOptions>(); if (operationsConfiguration?.OperationsControlServiceBaseUri == default) { throw new OpenApiServiceMismatchException("Could not find a configuration value for Operations:OperationsControlServiceBaseUri"); } return(operationsConfiguration); }); // Token source, to provide authentication when accessing external services. services.AddAzureManagedIdentityBasedTokenSource( sp => new AzureManagedIdentityTokenSourceOptions { AzureServicesAuthConnectionString = sp.GetRequiredService <IConfiguration>()["AzureServicesAuthConnectionString"], }); // Notification storage services.AddTenantedAzureTableUserNotificationStore( sp => new TenantCloudTableFactoryOptions { AzureServicesAuthConnectionString = sp.GetRequiredService <IConfiguration>()["AzureServicesAuthConnectionString"], }); return(services); }
public static void AddClientsToContainer(FeatureContext featureContext) { ContainerBindings.ConfigureServices( featureContext, services => { var controlClientOptions = new MarainOperationsControlClientOptions { OperationsControlServiceBaseUri = new Uri(ApiBindings.ControlApiBaseUrl), }; services.AddOperationsControlClient(controlClientOptions); services.AddOperationsStatusClient(new Uri(ApiBindings.StatusApiBaseUrl)); }); }
/// <summary> /// Adds the Operations control client to a service collection. /// </summary> /// <param name="services">The service collection.</param> /// <param name="getOptions">A callback that can be used to retrieve options for the client.</param> /// <returns>The modified service collection.</returns> public static IServiceCollection AddOperationsControlClient( this IServiceCollection services, Func <IServiceProvider, MarainOperationsControlClientOptions> getOptions) { services.AddSingleton(sp => { MarainOperationsControlClientOptions options = getOptions(sp); if (options is null || options.OperationsControlServiceBaseUri == null) { throw new InvalidOperationException( $"Cannot instantiate the Operations Control client without supplying a value for {nameof(MarainOperationsControlClientOptions.OperationsControlServiceBaseUri)}."); } return(BuildOperationsControlClient(sp, options.OperationsControlServiceBaseUri, options.ResourceIdForMsiAuthentication)); }); return(services); }
/// <summary> /// Adds the Operations control client to a service collection. /// </summary> /// <param name="services">The service collection.</param> /// <param name="options">Options for the client.</param> /// <returns>The modified service collection.</returns> public static IServiceCollection AddOperationsControlClient( this IServiceCollection services, MarainOperationsControlClientOptions options) { return(services.AddOperationsControlClient(_ => options)); }