WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 8c4efc2

Browse files
committed
feat: WPF项目引入Host,支持后台服务
1 parent 2442b64 commit 8c4efc2

File tree

3 files changed

+62
-14
lines changed

3 files changed

+62
-14
lines changed

src/OSharp.Utils/IO/DirectoryHelper.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// -----------------------------------------------------------------------
1+
// -----------------------------------------------------------------------
22
// <copyright file="DirectoryHelper.cs" company="OSharp开源团队">
33
// Copyright (c) 2014 OSharp. All rights reserved.
44
// </copyright>
@@ -33,6 +33,10 @@ public static string RootPath()
3333
/// <param name="directory">要创建的文件夹路径</param>
3434
public static void CreateIfNotExists(string directory)
3535
{
36+
if (string.IsNullOrEmpty(directory))
37+
{
38+
return;
39+
}
3640
if (!Directory.Exists(directory))
3741
{
3842
Directory.CreateDirectory(directory);
@@ -154,4 +158,4 @@ public static void SetAttributes(string directory, FileAttributes attribute, boo
154158
}
155159
}
156160
}
157-
}
161+
}

src/OSharp.Wpf/OSharp.Wpf.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,19 @@
2323
</ItemGroup>
2424
<ItemGroup Condition="'$(TargetFramework)'=='net6.0-windows'">
2525
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="6.*" />
26+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.*" />
2627
</ItemGroup>
2728
<ItemGroup Condition="'$(TargetFramework)'=='net7.0-windows'">
2829
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="7.*" />
30+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.*" />
2931
</ItemGroup>
3032
<ItemGroup Condition="'$(TargetFramework)'=='net8.0-windows'">
3133
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.*" />
34+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.*" />
3235
</ItemGroup>
33-
<ItemGroup Condition="'$(TargetFramework)'=='net9.0-windows'">
36+
<ItemGroup Condition="'$(TargetFramework)'=='net9.0-windows'">
3437
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.*" />
38+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.*" />
3539
</ItemGroup>
3640

3741
<ItemGroup>

src/OSharp.Wpf/Stylet/ServiceProviderBootstrapper.cs

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,43 @@
77
// <last-date>2020-05-28 15:00</last-date>
88
// -----------------------------------------------------------------------
99

10+
using Microsoft.Extensions.Hosting;
11+
12+
1013
namespace OSharp.Wpf.Stylet;
1114

1215
public abstract class ServiceProviderBootstrapper<TRootViewModel> : BootstrapperBase where TRootViewModel : class
1316
{
17+
private IHostBuilder _hostBuilder;
18+
private IHost _host;
19+
private readonly CancellationTokenSource _cancellationTokenSource = new();
1420
private TRootViewModel _rootViewModel;
1521
protected virtual TRootViewModel RootViewModel => this._rootViewModel ??= (TRootViewModel)this.GetInstance(typeof(TRootViewModel));
1622

17-
private ServiceProvider _serviceProvider;
23+
protected IServiceProvider ServiceProvider { get; private set; }
1824

19-
protected IServiceProvider ServiceProvider => _serviceProvider;
25+
/// <summary>
26+
/// Called on application startup. This occur after this.Args has been assigned, but before the IoC container has been configured
27+
/// </summary>
28+
protected override void OnStart()
29+
{
30+
_hostBuilder = Host.CreateDefaultBuilder();
31+
}
2032

2133
/// <summary>
2234
/// Overridden from BootstrapperBase, this sets up the IoC container
2335
/// </summary>
2436
protected override void ConfigureBootstrapper()
2537
{
26-
IServiceCollection services = new ServiceCollection();
27-
28-
// Call DefaultConfigureIoC *after* ConfigureIoIC, so that they can customize builder.Assemblies
29-
this.DefaultConfigureIoC(services);
30-
this.ConfigureIoC(services);
31-
32-
_serviceProvider = services.BuildServiceProvider();
38+
_hostBuilder.ConfigureServices((context, services) =>
39+
{
40+
services.AddSingleton(context);
41+
DefaultConfigureIoC(services);
42+
ConfigureIoC(services);
43+
});
44+
_host = _hostBuilder.Build();
45+
ServiceProvider = _host.Services;
46+
_host.StartAsync(_cancellationTokenSource.Token).GetAwaiter().GetResult();
3347
}
3448

3549
protected virtual void ConfigureIoC(IServiceCollection services)
@@ -40,7 +54,7 @@ protected virtual void DefaultConfigureIoC(IServiceCollection services)
4054
var viewManagerConfig = new ViewManagerConfig()
4155
{
4256
ViewFactory = this.GetInstance,
43-
ViewAssemblies = new List<Assembly>(){ this.GetType().Assembly}
57+
ViewAssemblies = new List<Assembly>() { this.GetType().Assembly }
4458
};
4559

4660
services.AddSingleton<IViewManager>(new ViewManager(viewManagerConfig));
@@ -72,13 +86,39 @@ public override object GetInstance(Type type)
7286
return ServiceProvider?.GetService(type);
7387
}
7488

89+
/// <summary>Hook called on application exit</summary>
90+
/// <param name="e">The exit event data</param>
91+
protected override void OnExit(ExitEventArgs e)
92+
{
93+
base.OnExit(e);
94+
// 在应用程序退出时停止 host
95+
_cancellationTokenSource.Cancel();
96+
try
97+
{
98+
_host?.StopAsync().GetAwaiter().GetResult();
99+
}
100+
catch (Exception ex)
101+
{
102+
// 记录日志但不阻止退出
103+
System.Diagnostics.Debug.WriteLine($"Error stopping host during exit: {ex.Message}");
104+
}
105+
}
106+
75107
/// <summary>
76108
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
77109
/// </summary>
78110
public override void Dispose()
79111
{
80112
base.Dispose();
113+
try
114+
{
115+
_host?.StopAsync().GetAwaiter().GetResult();
116+
}
117+
finally
118+
{
119+
_host?.Dispose();
120+
_cancellationTokenSource.Dispose();
121+
}
81122
ScreenExtensions.TryDispose(_rootViewModel);
82-
_serviceProvider?.Dispose();
83123
}
84124
}

0 commit comments

Comments
 (0)