/// <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);
        }
コード例 #2
0
        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));
 }