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 MyCore.Services; 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; } public static IServiceCollection AddMerossClientHostedService(this IServiceCollection services) { services.AddMerossClientServiceWithConfig(aspOnlineOptionBuilder => { /*var clientSettings = AppSettingsMerossProvider.ClientMerossSettings; var brokerHostSettings = AppSettingsMerossProvider.BrokerHostMerossSettings; 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; } private static IServiceCollection AddMerossClientServiceWithConfig(this IServiceCollection services, Action configure) { /*services.AddSingleton(serviceMerossProvider => { var optionBuilder = new AspCoreMerossClientOptionBuilder(serviceMerossProvider); configure(optionBuilder); return optionBuilder.Build(); });*/ services.AddSingleton(); services.AddSingleton(serviceProvider => { return serviceProvider.GetService(); }); services.AddSingleton(serviceProvider => { var merossClientService = serviceProvider.GetService(); var merossServiceProvider = new MqttClientMerossServiceProvider(merossClientService); return merossServiceProvider; }); return services; } } }