using Birdmap.BLL.Interfaces; using Birdmap.BLL.Options; using Birdmap.BLL.Services; using Birdmap.BLL.Services.CommunationServices.RabbitMq; using Birdmap.BLL.Services.CommunicationServices; 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(); var mqtt = configuration.GetSection("Mqtt"); var client = mqtt.GetSection("ClientSettings"); var clientSettings = new { Id = client.GetValue("Id"), Username = client.GetValue("Username"), Password = client.GetValue("Password"), Topic = client.GetValue("Topic"), }; var brokerHost = mqtt.GetSection("BrokerHostSettings"); var brokerHostSettings = new { Host = brokerHost.GetValue("Host"), Port = brokerHost.GetValue("Port"), VirtualHost = brokerHost.GetValue("VirtualHost"), }; var exchange = mqtt.GetSection("ExchangeSettings"); var exchangeSettings = new { Name = exchange.GetValue("Name"), Type = exchange.GetValue("Type"), Durable = exchange.GetValue("Durable"), AutoDelete = exchange.GetValue("AutoDelete"), }; var queue = mqtt.GetSection("QueueSettings"); var queueSettings = new { Name = queue.GetValue("Name"), Durable = exchange.GetValue("Durable"), Exclusive = exchange.GetValue("Exclusive"), AutoDelete = exchange.GetValue("AutoDelete"), }; if (configuration.GetValue("UseRabbitMq")) { services.AddRabbitMqClientServiceWithConfig(new RabbitMqClientOptions( Hostname: brokerHostSettings.Host, Port: brokerHostSettings.Port, VirtualHost: brokerHostSettings.VirtualHost, Username: clientSettings.Username, Password: clientSettings.Password, ExchangeName: exchangeSettings.Name, ExchangeType: exchangeSettings.Type, ExchangeDurable: exchangeSettings.Durable, ExchangeAutoDelete: exchangeSettings.AutoDelete, QueueName: queueSettings.Name, QueueDurable: queueSettings.Durable, QueueExclusive: queueSettings.Exclusive, QueueAutoDelete: queueSettings.AutoDelete, Topic: clientSettings.Topic)); } else { services.AddMqttClientServiceWithConfig(opt => { 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 MqttClientOptions(serviceProvider); configureOptions(optionBuilder); return optionBuilder.Build(); }); services.AddClientServiceWithProvider(); return services; } private static IServiceCollection AddRabbitMqClientServiceWithConfig(this IServiceCollection services, RabbitMqClientOptions options) { services.AddSingleton(options); services.AddClientServiceWithProvider(); return services; } private static IServiceCollection AddClientServiceWithProvider(this IServiceCollection services) where T : class, ICommunicationService { services.AddSingleton(); services.AddSingleton(serviceProvider => { return serviceProvider.GetService(); }); services.AddSingleton(serviceProvider => { var clientService = serviceProvider.GetService(); var clientServiceProvider = new CommunicationServiceProvider(clientService); return clientServiceProvider; }); return services; } } }