Skip to content

Commit abec1da

Browse files
Support Host.CreateApplicationBuilder() (#1327)
* Also support IHostApplicationBuilder instead of only IhostBuilder * fix merge error * remove duplicate AddSeriLog
1 parent 25a52e3 commit abec1da

9 files changed

Lines changed: 112 additions & 66 deletions

File tree

src/AppModel/NetDaemon.AppModel/Common/Extensions/ServiceCollectionExtension.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Reflection;
22
using NetDaemon.AppModel.Internal.AppAssemblyProviders;
33
using NetDaemon.AppModel.Internal.AppFactoryProviders;
4-
54
using NetDaemon.AppModel.Internal.Config;
65

76
namespace NetDaemon.AppModel;

src/Extensions/NetDaemon.Extensions.Logging/Common/ServiceCollectionExtensions.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.Extensions.Hosting;
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Hosting;
23
using NetDaemon.Extensions.Logging.Internal;
34
using Serilog;
45

@@ -18,4 +19,15 @@ public static IHostBuilder UseNetDaemonDefaultLogging(this IHostBuilder builder)
1819
return builder.UseSerilog((context, loggerConfiguration) =>
1920
SerilogConfigurator.Configure(loggerConfiguration, context.HostingEnvironment));
2021
}
21-
}
22+
23+
/// <summary>
24+
/// Adds default logging capabilities for NetDaemon
25+
/// </summary>
26+
/// <param name="services"></param>
27+
public static IServiceCollection AddNetDaemonDefaultLogging(this IServiceCollection services)
28+
{
29+
services.AddSerilog((context, loggerConfiguration) =>
30+
SerilogConfigurator.Configure(loggerConfiguration, context.GetRequiredService<IHostEnvironment>()));
31+
return services;
32+
}
33+
}

src/Extensions/NetDaemon.Extensions.MqttEntityManager/DependencyInjectionSetup.cs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,25 @@ public static class DependencyInjectionSetup
2020
/// <returns></returns>
2121
public static IHostBuilder UseNetDaemonMqttEntityManagement(this IHostBuilder hostBuilder)
2222
{
23-
return hostBuilder.ConfigureServices((context, services) =>
23+
return hostBuilder.ConfigureServices((_, services) =>
2424
{
25-
services.AddSingleton<IMqttFactory, MqttFactoryFactory>();
26-
services.AddSingleton<IMqttClientOptionsFactory, MqttClientOptionsFactory>();
27-
services.AddSingleton<IMqttFactoryWrapper, MqttFactoryWrapper>();
28-
services.AddSingleton<IMqttEntityManager, MqttEntityManager>();
29-
services.AddSingleton<IAssuredMqttConnection, AssuredMqttConnection>();
30-
services.AddSingleton<IMessageSender, MessageSender>();
31-
services.AddSingleton<IMessageSubscriber, MessageSubscriber>();
32-
services.Configure<MqttConfiguration>(context.Configuration.GetSection("Mqtt"));
25+
services.AddNetDaemonMqttEntityManagement();
3326
});
3427
}
35-
}
28+
29+
/// <summary>
30+
/// Add support for managing entities via MQTT
31+
/// </summary>
32+
public static IServiceCollection AddNetDaemonMqttEntityManagement(this IServiceCollection services)
33+
{
34+
services.AddSingleton<IMqttFactory, MqttFactoryFactory>();
35+
services.AddSingleton<IMqttClientOptionsFactory, MqttClientOptionsFactory>();
36+
services.AddSingleton<IMqttFactoryWrapper, MqttFactoryWrapper>();
37+
services.AddSingleton<IMqttEntityManager, MqttEntityManager>();
38+
services.AddSingleton<IAssuredMqttConnection, AssuredMqttConnection>();
39+
services.AddSingleton<IMessageSender, MessageSender>();
40+
services.AddSingleton<IMessageSubscriber, MessageSubscriber>();
41+
services.AddOptions<MqttConfiguration>().BindConfiguration("Mqtt");
42+
return services;
43+
}
44+
}

src/Extensions/NetDaemon.Extensions.Tts/HostBuilderExtensions.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Microsoft.Extensions.DependencyInjection;
2-
using Microsoft.Extensions.Hosting;
3-
using NetDaemon.Extensions.Tts.Internal;
1+
using Microsoft.Extensions.Hosting;
42

53
namespace NetDaemon.Extensions.Tts;
64

@@ -17,9 +15,8 @@ public static IHostBuilder UseNetDaemonTextToSpeech(this IHostBuilder hostBuilde
1715
{
1816
hostBuilder.ConfigureServices(services =>
1917
{
20-
services.AddSingleton<TextToSpeechService>();
21-
services.AddSingleton<ITextToSpeechService>(s => s.GetRequiredService<TextToSpeechService>());
18+
services.AddNetDaemonTextToSpeech();
2219
});
2320
return hostBuilder;
2421
}
25-
}
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using NetDaemon.Extensions.Tts.Internal;
3+
4+
namespace NetDaemon.Extensions.Tts;
5+
6+
/// <summary>
7+
/// Extension methods for text-to-speech
8+
/// </summary>
9+
public static class ServiceCollectionExtensions
10+
{
11+
/// <summary>
12+
/// Use the text-to-speech engine of NetDaemon
13+
/// </summary>
14+
/// <param name="services"></param>
15+
public static IServiceCollection AddNetDaemonTextToSpeech(this IServiceCollection services)
16+
{
17+
services.AddSingleton<TextToSpeechService>();
18+
services.AddSingleton<ITextToSpeechService>(s => s.GetRequiredService<TextToSpeechService>());
19+
return services;
20+
}
21+
}

src/Runtime/NetDaemon.Runtime/Common/Extensions/HostBuilderExtensions.cs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using Microsoft.Extensions.Configuration;
22
using NetDaemon.AppModel;
3-
using NetDaemon.HassModel;
4-
using NetDaemon.Runtime.Internal;
53

64
namespace NetDaemon.Runtime;
75

@@ -19,7 +17,7 @@ public static class HostBuilderExtensions
1917
/// - Register appsettings.json to the host configuration
2018
/// - Register all the yaml settings from the path set in the current configuration to the configuration provider
2119
/// - Call 'ConfigureNetDaemonServices' in the service collection
22-
///
20+
///
2321
/// You can call these methods separately if you want to do something else in between, or if you're calling any of these methods already.
2422
/// Change `UseNetDaemonAppSettings` to `.RegisterAppSettingsJsonToHost().RegisterYamlSettings()` and call `ConfigureNetDaemonServices(context.Configuration)` in ConfigureServices.
2523
/// </remarks>
@@ -28,18 +26,33 @@ public static IHostBuilder UseNetDaemonAppSettings(this IHostBuilder hostBuilder
2826
return hostBuilder
2927
.RegisterAppSettingsJsonToHost()
3028
.RegisterYamlSettings()
31-
.ConfigureServices((context, services)
32-
=> services.ConfigureNetDaemonServices(context.Configuration)
29+
.ConfigureServices((_, services)
30+
=> services.ConfigureNetDaemonServices()
3331
);
3432
}
3533

34+
/// <summary>
35+
/// Adds the yaml appsettings to the configuration
36+
/// </summary>
37+
/// <param name="hostBuilder"></param>
38+
/// <typeparam name="T"></typeparam>
39+
/// <returns></returns>
40+
public static T UseNetDaemonAppSettings<T>(this T hostBuilder) where T : IHostApplicationBuilder
41+
{
42+
hostBuilder.Configuration.AddYamlAppConfigs(hostBuilder.Configuration);
43+
44+
return hostBuilder;
45+
}
46+
47+
3648
/// <summary>
3749
/// Registers appsettings.json to the host configuration
3850
/// </summary>
3951
/// <param name="hostBuilder"></param>
4052
/// <remarks>This enables using data from the appsettings.json in the `ConfigureAppConfiguration` call</remarks>
4153
public static IHostBuilder RegisterAppSettingsJsonToHost(this IHostBuilder hostBuilder)
4254
{
55+
// The default Host Builders already add appsettings.json, not sure why this is needed here
4356
return hostBuilder.ConfigureHostConfiguration(config =>
4457
{
4558
config.AddJsonFile("appsettings.json", optional: true);
@@ -65,16 +78,9 @@ public static IHostBuilder RegisterYamlSettings(this IHostBuilder hostBuilder)
6578
public static IHostBuilder UseNetDaemonRuntime(this IHostBuilder hostBuilder)
6679
{
6780
return hostBuilder
68-
.UseAppScopedHaContext()
69-
.ConfigureServices((context, services) =>
81+
.ConfigureServices((_, services) =>
7082
{
71-
services.AddLogging();
72-
services.AddHostedService<RuntimeService>();
73-
services.AddHomeAssistantClient();
74-
services.Configure<HomeAssistantSettings>(context.Configuration.GetSection("HomeAssistant"));
75-
services.AddSingleton<NetDaemonRuntime>();
76-
services.AddSingleton<IRuntime>(provider => provider.GetRequiredService<NetDaemonRuntime>());
77-
services.AddSingleton<INetDaemonRuntime>(provider => provider.GetRequiredService<NetDaemonRuntime>());
83+
services.AddNetDaemonRuntime();
7884
});
7985
}
8086
}
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Microsoft.Extensions.Configuration;
22
using NetDaemon.AppModel;
3+
using NetDaemon.HassModel;
4+
using NetDaemon.Runtime.Internal;
35

46
namespace NetDaemon.Runtime;
57

@@ -9,15 +11,30 @@ namespace NetDaemon.Runtime;
911
public static class ServiceCollectionExtensions
1012
{
1113
/// <summary>
12-
/// Loads NetDaemon and HomeAssistant configuration sections
14+
/// Adds the NetDaemon Runtime Services to a IServiceCollection
15+
/// </summary>
16+
public static IServiceCollection AddNetDaemonRuntime(this IServiceCollection services)
17+
{
18+
services.AddScopedHaContext();
19+
services.AddLogging();
20+
services.AddHostedService<RuntimeService>();
21+
services.AddHomeAssistantClient();
22+
services.AddOptions<HomeAssistantSettings>().BindConfiguration("HomeAssistant");
23+
services.AddSingleton<NetDaemonRuntime>();
24+
services.AddSingleton<IRuntime>(provider => provider.GetRequiredService<NetDaemonRuntime>());
25+
services.AddSingleton<INetDaemonRuntime>(provider => provider.GetRequiredService<NetDaemonRuntime>());
26+
return services;
27+
}
28+
29+
/// <summary>
30+
/// Loads NetDaemon configuration section
1331
/// </summary>
1432
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
1533
/// <param name="config">The current <see cref="IConfiguration" /> instance</param>
1634
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
17-
public static IServiceCollection ConfigureNetDaemonServices(this IServiceCollection services, IConfiguration config)
35+
public static IServiceCollection ConfigureNetDaemonServices(this IServiceCollection services)
1836
{
19-
return services.Configure<AppConfigurationLocationSetting>(config.GetSection("NetDaemon"))
20-
.Configure<HomeAssistantSettings>(config.GetSection("HomeAssistant"));
21-
// todo: maybe remove 'HomeAssistant' section this here, is this method really needed? If we remove this we can inline the rest
37+
services.AddOptions<AppConfigurationLocationSetting>().BindConfiguration("NetDaemon");
38+
return services;
2239
}
23-
}
40+
}

src/debug/DebugHost/Program.cs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,15 @@
66
using NetDaemon.Extensions.Tts;
77
using NetDaemon.Extensions.MqttEntityManager;
88

9-
#pragma warning disable CA1812
9+
var builder = Host.CreateApplicationBuilder(args);
10+
builder.UseNetDaemonAppSettings();
1011

11-
try
12-
{
13-
await Host.CreateDefaultBuilder(args)
14-
.UseNetDaemonAppSettings()
15-
.UseNetDaemonDefaultLogging()
16-
.UseNetDaemonRuntime()
17-
.UseNetDaemonTextToSpeech()
18-
.UseNetDaemonMqttEntityManagement()
19-
.ConfigureServices((_, services) =>
20-
services
21-
// change type of compilation here
22-
// .AddAppsFromSource(true)
23-
.AddAppsFromAssembly(Assembly.GetEntryAssembly()!)
24-
// Remove this is you are not running the integration!
25-
.AddNetDaemonStateManager()
26-
)
27-
.Build()
28-
.RunAsync()
29-
.ConfigureAwait(false);
30-
}
31-
catch (Exception e)
32-
{
33-
Console.WriteLine($"Failed to start host... {e}");
34-
throw;
35-
}
12+
builder.Services
13+
.AddNetDaemonRuntime()
14+
.AddNetDaemonDefaultLogging()
15+
.AddNetDaemonTextToSpeech()
16+
.AddNetDaemonMqttEntityManagement()
17+
.AddAppsFromAssembly(Assembly.GetExecutingAssembly())
18+
.AddNetDaemonStateManager();
19+
20+
await builder.Build().RunAsync();

src/debug/DebugWebHost/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
using NetDaemon.Runtime;
33

44
var builder = WebApplication.CreateBuilder(args);
5-
builder.Host.UseNetDaemonRuntime();
65

6+
builder.Services.AddNetDaemonRuntime();
77
var app = builder.Build();
88

99
app.MapGet("/", (IHaContext ha) => ha.GetAllEntities().Where(e=>e.EntityId.StartsWith("light", StringComparison.Ordinal)).Select(e => e.EntityId));

0 commit comments

Comments
 (0)