public static void AddStandalone()

in TailwindTraders.Website/Source/Tailwind.Traders.Web/Standalone/ConfigExtensions.cs [22:99]


        public static void AddStandalone(this IServiceCollection services, IConfiguration config, ILogger logger)
        {
            if (!IsStandaloneEnabled(config))
            {
                return;
            }

            services.AddScoped<SqlConnection>(
                _ => new SqlConnection(config["SqlConnectionString"]));

            var telemetryClient = new TelemetryClient();
            var mongoConnectionString = config["MongoConnectionString"] ?? "mongodb://localhost:27017";
            var mongoClientSettings = MongoClientSettings.FromConnectionString(mongoConnectionString);
            mongoClientSettings.ClusterConfigurator = cc =>
            {
                cc.Subscribe<CommandSucceededEvent>(e =>
                {
                    telemetryClient.TrackDependency(
                        "mongodb", 
                        mongoClientSettings.Server.Host, 
                        null, 
                        DateTimeOffset.UtcNow.AddMilliseconds(-1 * e.Duration.TotalMilliseconds), 
                        e.Duration, 
                        success: true);
                });
                cc.Subscribe<CommandFailedEvent>(e =>
                {
                    telemetryClient.TrackDependency(
                        "mongodb", 
                        mongoClientSettings.Server.Host, 
                        e.Failure.ToString(), 
                        DateTimeOffset.UtcNow.AddMilliseconds(-1 * e.Duration.TotalMilliseconds), 
                        e.Duration, 
                        success: false);
                });
            };
            var mongoClient = new MongoClient(mongoClientSettings);
            services.AddSingleton(mongoClient);

            services.AddTransient<IProductService, ProductService>();
            
            var useCustomVisionApi = !string.IsNullOrEmpty(config["ImagePredictorEndpoint"]);
            if (useCustomVisionApi)
            {
                services.AddSingleton<IImageSearchTermPredictor, HttpEndpointSearchTermPredictor>();
            }
            else
            {
                services.AddSingleton<IImageSearchTermPredictor, OnnxImageSearchTermPredictor>();
            }
            
            services.AddTransient<IImageSearchService, ImageSearchService>();

            // demo only, do not do this in real life!
            const string defaultSecurityKey = Constants.DefaultJwtSigningKey;
            var securityKey = config["SecurityKey"] ?? defaultSecurityKey;
            var key = Encoding.ASCII.GetBytes(securityKey);
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            var initializer = new StandaloneDatabaseInitializer(logger, config["SqlConnectionString"]);
            initializer.Seed().Wait();
        }