Review requirement of Microsoft.Extensions.Hosting

This commit is contained in:
Jöran Malek 2024-02-08 01:19:26 +01:00
parent 2a7ff864bf
commit 29b0e78cc1
5 changed files with 22 additions and 31 deletions

8
Directory.Build.props Normal file
View file

@ -0,0 +1,8 @@
<Project>
<!-- See https://aka.ms/dotnet/msbuild/customize for more details on customizing your build -->
<PropertyGroup>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
</Project>

View file

@ -17,7 +17,6 @@
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0" /> <PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0" />
<PackageVersion Include="Splat.Microsoft.Extensions.DependencyInjection" Version="14.8.12" /> <PackageVersion Include="Splat.Microsoft.Extensions.DependencyInjection" Version="14.8.12" />

View file

@ -3,19 +3,15 @@ using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Microsoft.Extensions.Hosting;
using ReactiveUI; using ReactiveUI;
namespace InkForge.Common; namespace InkForge.Common;
public partial class App : Application public partial class App : Application
{ {
public static readonly StyledProperty<IHost> HostProperty = AvaloniaProperty.Register<App, IHost>("Host"); public static readonly StyledProperty<IServiceProvider> ServiceProviderProperty = AvaloniaProperty.Register<App, IServiceProvider>(nameof(ServiceProvider));
public IHost Host => GetValue(HostProperty); public IServiceProvider ServiceProvider => GetValue(ServiceProviderProperty);
public IServiceProvider Services => Host.Services;
public override void Initialize() public override void Initialize()
{ {

View file

@ -10,7 +10,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia.ReactiveUI" /> <PackageReference Include="Avalonia.ReactiveUI" />
<PackageReference Include="Avalonia.Themes.Fluent" /> <PackageReference Include="Avalonia.Themes.Fluent" />
<PackageReference Include="Microsoft.Extensions.Hosting" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="Microsoft.Extensions.Http" /> <PackageReference Include="Microsoft.Extensions.Http" />
</ItemGroup> </ItemGroup>

View file

@ -5,7 +5,6 @@ using Avalonia.Threading;
using InkForge.Common; using InkForge.Common;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using ReactiveUI; using ReactiveUI;
@ -17,7 +16,7 @@ static class Program
[STAThread] [STAThread]
public static void Main(string[] args) public static void Main(string[] args)
=> BuildAvaloniaApp() => BuildAvaloniaApp()
.UseMicrosoftExtensionsHosting(args) .UseMicrosoftDependencyInjection(args)
.StartWithClassicDesktopLifetime(args); .StartWithClassicDesktopLifetime(args);
public static AppBuilder BuildAvaloniaApp() public static AppBuilder BuildAvaloniaApp()
@ -40,39 +39,28 @@ static class Program
// services.AddTransient<IViewFor<MainViewModel>, MainWindow>(); // services.AddTransient<IViewFor<MainViewModel>, MainWindow>();
} }
private static void OnSetup(this HostApplicationBuilder hostBuilder, AppBuilder appBuilder) private static void OnSetup(this IServiceCollection services, AppBuilder appBuilder)
{ {
var dispatcher = Dispatcher.UIThread; var dispatcher = Dispatcher.UIThread;
var app = appBuilder.Instance!; var app = appBuilder.Instance!;
hostBuilder.Services services
.AddSingleton(app) .AddSingleton(app)
.AddSingleton(app.ApplicationLifetime!) .AddSingleton(app.ApplicationLifetime!)
.AddSingleton(app.PlatformSettings!) .AddSingleton(app.PlatformSettings!)
.AddSingleton(dispatcher); .AddSingleton(dispatcher);
var host = hostBuilder.Build(); var serviceProvider = services.BuildServiceProvider();
host.Services.UseMicrosoftDependencyResolver(); serviceProvider.UseMicrosoftDependencyResolver();
app.SetValue(App.HostProperty, host); app.SetValue(App.ServiceProviderProperty, serviceProvider);
dispatcher.ShutdownStarted += host.Shutdown; dispatcher.ShutdownFinished += (_, _) => serviceProvider.Dispose();
dispatcher.Post(static arg =>
{
var host = (IHost)arg!;
host.StartAsync()
.GetAwaiter()
.GetResult();
}, host, DispatcherPriority.Send);
} }
private static void Shutdown(this IHost host, object? sender, EventArgs e) private static AppBuilder UseMicrosoftDependencyInjection(this AppBuilder builder, string[] args)
=> host.StopAsync().GetAwaiter().GetResult();
private static AppBuilder UseMicrosoftExtensionsHosting(this AppBuilder builder, string[] args)
{ {
var hostBuilder = Host.CreateApplicationBuilder(args); ServiceCollection services = [];
ConfigureServices(hostBuilder.Services); ConfigureServices(services);
builder.AfterSetup(hostBuilder.OnSetup); builder.AfterSetup(services.OnSetup);
return builder; return builder;
} }
} }