using Birdmap.BLL.Interfaces; using Birdmap.BLL.Options; using Birdmap.BLL.Services; using Birdmap.BLL.Services.CommunicationServices.Mqtt; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Net.Http; namespace Birdmap.BLL { public static class Startup { public static IServiceCollection ConfigureBLL(this IServiceCollection services, IConfiguration configuration) { services.AddTransient(); services.AddTransient(); services.AddTransient(); if (configuration.GetValue("UseDummyServices")) { services.AddTransient(); services.AddTransient(); } else { var baseUrl = configuration.GetValue("ServicesBaseUrl"); services.AddTransient(serviceProvider => { var httpClient = serviceProvider.GetService(); var service = new LiveInputService(baseUrl, httpClient); return service; }); services.AddTransient(serviceProvider => { var httpClient = serviceProvider.GetService(); var service = new LiveDeviceService(baseUrl, httpClient); return service; }); } services.AddSignalR(); services.AddMqttClientServiceWithConfig(opt => { var mqtt = configuration.GetSection("Mqtt"); var mqttClient = mqtt.GetSection("ClientSettings"); var clientSettings = new { Id = mqttClient.GetValue("Id"), Username = mqttClient.GetValue("Username"), Password = mqttClient.GetValue("Password"), Topic = mqttClient.GetValue("Topic"), }; var mqttBrokerHost = mqtt.GetSection("BrokerHostSettings"); var brokerHostSettings = new { Host = mqttBrokerHost.GetValue("Host"), Port = mqttBrokerHost.GetValue("Port"), }; opt .WithTopic(clientSettings.Topic) .WithCredentials(clientSettings.Username, clientSettings.Password) .WithClientId(clientSettings.Id) .WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port); }); return services; } private static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action configureOptions) { services.AddSingleton(serviceProvider => { var optionBuilder = new AspCoreMqttClientOptions(serviceProvider); configureOptions(optionBuilder); return optionBuilder.Build(); }); services.AddSingleton(); services.AddSingleton(serviceProvider => { return serviceProvider.GetService(); }); services.AddSingleton(serviceProvider => { var mqttClientService = serviceProvider.GetService(); var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService); return mqttClientServiceProvider; }); return services; } } }