using Evergreen.Health.Application.Health.Devices.Audio; using Evergreen.Health.Application.Health.Devices.Contracts; using Evergreen.Health.Application.Health.Devices.Environment; using Evergreen.Health.Application.Health.Devices.Climate; using Evergreen.Health.Application.Health.Devices.Curtain; using Evergreen.Health.Application.Health.Devices.Discovery; using Evergreen.Health.Application.Health.Devices.Dehumidifier; using Evergreen.Health.Application.Health.Devices.Fragrance; using Evergreen.Health.Application.Health.Devices.Lighting; using Evergreen.Health.Application.Health.Devices.Outlet; using Evergreen.Health.Application.Health.Integrations.HomeAssistant; using Evergreen.Health.Application.Health.Integrations.MiAirX; using Evergreen.Health.Application.Health.Scenes; using Evergreen.Health.Application.Health.Sleep; using Evergreen.Health.Application.Health.Integrations.Tuya; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Evergreen.Health.Application.Health.Integrations.Ib43; namespace Evergreen.Health.Application.Health.Devices; public static class HealthDeviceRegistration { public static IServiceCollection AddHealthDevices(this IServiceCollection services) { services.AddSingleton(TimeProvider.System); services.AddOptions(); services.AddSingleton(); services.AddSingleton(); services.AddScoped(provider => new Ib43DataRepository( provider.GetRequiredService().AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId))); services.AddSingleton(); services.AddSingleton(); services.AddOptions(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddHostedService(provider => provider.GetRequiredService()); services.AddHostedService(); services.AddSingleton(new DeviceExecutionOptions()); // 仅注册扩展契约,不启动传感器轮询、上床流程或占位音频播放。 services.AddSingleton(new SleepWorkflowOptions()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); services.AddTransient(); services.AddSingleton(provider => new HomeAssistantClient( provider.GetRequiredService().CreateClient(nameof(HomeAssistantClient)), provider.GetRequiredService>())); services.AddSingleton(provider => new MiAirXClient( provider.GetRequiredService().CreateClient(nameof(MiAirXClient)), provider.GetRequiredService>())); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddHostedService(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddHostedService(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(provider => new( provider.GetRequiredService(), provider.GetRequiredService>(), provider.GetRequiredService().ForEntity( provider.GetRequiredService>().Value.Entities.AmbientLight), provider.GetRequiredService())); services.AddSingleton(); services.AddSingleton(provider => provider.GetRequiredService()); services.AddSingleton(); services.AddSingleton(provider => { var options = provider.GetRequiredService>().Value; var modules = provider.GetServices().Where(module => module.EntityIds.Any()).ToList(); if (!string.IsNullOrWhiteSpace(options.Entities.Outlet)) modules.Add(provider.GetRequiredService()); if (!string.IsNullOrWhiteSpace(options.Entities.AmbientLight)) modules.Add(provider.GetRequiredService()); var lights = provider.GetRequiredService(); var runner = provider.GetRequiredService(); modules.AddRange(options.AdditionalSleepLights.Select(light => new ConfiguredSleepLightModule(runner, light, lights.ForEntity(light.EntityId)))); return new DeviceModuleRegistry(modules); }); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); return services; } }