using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Mqtt.Client.AspNetCore.Options; using Mqtt.Client.AspNetCore.Services; using Mqtt.Client.AspNetCore.Settings; using MQTTnet.Client.Options; using System; namespace MyCore.Service.Extensions { public static class ServiceCollectionExtension { public static IServiceCollection AddMqttClientHostedService(this IServiceCollection services) { services.AddMqttClientServiceWithConfig(aspOptionBuilder => { var clientSettings = AppSettingsProvider.ClientSettings; var brokerHostSettings = AppSettingsProvider.BrokerHostSettings; aspOptionBuilder .WithCredentials(clientSettings.UserName, clientSettings.Password) .WithClientId(clientSettings.Id) .WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port); }); return services; } public static IServiceCollection AddMqttClientOnlineHostedService(this IServiceCollection services) { services.AddMqttClientOnlineServiceWithConfig(aspOnlineOptionBuilder => { var clientSettings = AppSettingsOnlineProvider.ClientOnlineSettings; var brokerHostSettings = AppSettingsOnlineProvider.BrokerHostOnlineSettings; aspOnlineOptionBuilder .WithCredentials(clientSettings.UserName, clientSettings.Password) .WithClientId(clientSettings.Id) .WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port); }); return services; } private static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action configure) { // No need as we implement options in service (localhost) /*services.AddSingleton(serviceProvider => { var optionBuilder = new AspCoreMqttClientOptionBuilder(serviceProvider); configure(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; } private static IServiceCollection AddMqttClientOnlineServiceWithConfig(this IServiceCollection services, Action configure) { services.AddSingleton(serviceOnlineProvider => { var optionBuilder = new AspCoreMqttOnlineClientOptionBuilder(serviceOnlineProvider); configure(optionBuilder); return optionBuilder.Build(); }); services.AddSingleton(); services.AddSingleton(serviceProvider => { return serviceProvider.GetService(); }); services.AddSingleton(serviceProvider => { var mqttOnlineClientService = serviceProvider.GetService(); var mqttOnlineClientServiceProvider = new MqttClientOnlineServiceProvider(mqttOnlineClientService); return mqttOnlineClientServiceProvider; }); return services; } } }