@elf-express/admin-net-mcp 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/index.js +83 -88
  2. package/knowledge/Furion_Teaching_Manual/04-1-/351/205/215/347/275/256.md +442 -0
  3. package/knowledge/Furion_Teaching_Manual/04-2-/351/201/270/351/240/205.md +363 -0
  4. package/knowledge/Furion_Teaching_Manual/05-1-/345/213/225/346/205/213WebAPI.md +825 -0
  5. package/knowledge/Furion_Teaching_Manual/05-2-HttpContext.md +217 -0
  6. package/knowledge/Furion_Teaching_Manual/05-3-/347/257/251/351/201/270/345/231/250/346/224/224/346/210/252/345/231/250AOP.md +581 -0
  7. package/knowledge/Furion_Teaching_Manual/05-4-/350/253/213/346/261/202/347/250/275/346/240/270/346/227/245/350/252/214.md +129 -0
  8. package/knowledge/Furion_Teaching_Manual/05-5-/344/270/255/344/273/213/350/273/237/351/253/224Middleware.md +328 -0
  9. package/knowledge/Furion_Teaching_Manual/05-6-Vue-React-Angular/344/273/213/351/235/242/344/273/243/347/220/206.md +317 -0
  10. package/knowledge/Furion_Teaching_Manual/06-1/350/246/217/347/257/204/345/214/226/346/216/245/345/217/243.md +1458 -0
  11. package/knowledge/Furion_Teaching_Manual/06-2/347/254/254/344/270/211/346/226/271API_Scalar.md +91 -0
  12. package/knowledge/Furion_Teaching_Manual/07-/345/217/213/345/245/275/344/276/213/345/244/226/350/231/225/347/220/206.md +511 -0
  13. package/knowledge/Furion_Teaching_Manual/08-1-/350/263/207/346/226/231/351/251/227/350/255/211/345/237/272/347/244/216/344/275/277/347/224/250.md +587 -0
  14. package/knowledge/Furion_Teaching_Manual/10-1-SqlSugar/346/225/264/345/220/210.md +336 -0
  15. package/knowledge/Furion_Teaching_Manual/11-SaaS /345/244/232/347/247/237/346/210/266/347/255/206/350/250/230.md" +271 -0
  16. package/knowledge/Furion_Teaching_Manual/12-furion-dependency-injection.md +408 -0
  17. package/knowledge/Furion_Teaching_Manual/13-/347/211/251/344/273/266/350/263/207/346/226/231/346/230/240/345/260/204/357/274/210Mapster/357/274/211.md +162 -0
  18. package/knowledge/Furion_Teaching_Manual/14-/345/210/206/345/270/203/345/274/217/347/274/223/345/255/230.md +311 -0
  19. package/knowledge/Furion_Teaching_Manual/15-/345/256/211/345/205/250/351/211/264/346/235/203.md +832 -0
  20. package/knowledge/Furion_Teaching_Manual/17-/346/252/242/350/246/226/347/257/204/346/234/254/345/274/225/346/223/216.md +327 -0
  21. package/knowledge/Furion_Teaching_Manual/18-/346/227/245/350/252/214/350/250/230/351/214/204.md +639 -0
  22. package/knowledge/Furion_Teaching_Manual/19-1-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/237/272/347/244/216/344/275/277/347/224/250.md +621 -0
  23. package/knowledge/Furion_Teaching_Manual/19-2-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/351/200/262/351/232/216/346/214/207/345/215/227.md +928 -0
  24. package/knowledge/Furion_Teaching_Manual/19-3-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/270/270/350/246/213/345/225/217/351/241/214.md +362 -0
  25. package/knowledge/Furion_Teaching_Manual/20-/350/263/207/346/226/231/345/212/240/350/247/243/345/257/206.md +286 -0
  26. package/knowledge/Furion_Teaching_Manual/20-/351/231/204/351/214/204-KSort/350/263/207/346/226/231/347/260/275/345/220/215/345/256/214/346/225/264/345/216/237/345/247/213/347/242/274.md +305 -0
  27. package/knowledge/Furion_Teaching_Manual/21-/345/205/250/347/220/203/345/214/226/345/222/214/346/234/254/345/234/260/345/214/226.md +342 -0
  28. package/knowledge/Furion_Teaching_Manual/22-/344/272/213/344/273/266/345/214/257/346/265/201/346/216/222EventBus.md +448 -0
  29. package/knowledge/Furion_Teaching_Manual/23-JSON/345/272/217/345/210/227/345/214/226.md +340 -0
  30. package/knowledge/Furion_Teaching_Manual/24-/345/215/263/346/231/202/351/200/232/350/250/212SignalR.md +247 -0
  31. package/knowledge/Furion_Teaching_Manual/25-/350/274/224/345/212/251/350/247/222/350/211/262/346/234/215/345/213/231WorkerService.md +295 -0
  32. package/knowledge/Furion_Teaching_Manual/26-1-/346/216/222/347/250/213/344/275/234/346/245/255/345/256/232/346/231/202/344/273/273/345/213/231.md +631 -0
  33. package/knowledge/Furion_Teaching_Manual/26-2-Cron/350/241/250/351/201/224/345/274/217.md +203 -0
  34. package/knowledge/Furion_Teaching_Manual/26-3-/344/273/273/345/213/231/344/275/207/345/210/227TaskQueue.md +215 -0
  35. package/knowledge/Furion_Teaching_Manual/27-/345/210/206/346/225/243/345/274/217ID/347/224/237/346/210/220.md +86 -0
  36. package/knowledge/Furion_Teaching_Manual/28-/346/250/241/347/265/204/345/214/226/351/226/213/347/231/274.md +68 -0
  37. package/knowledge/Furion_Teaching_Manual/29-/346/265/201/350/256/212/347/211/251/344/273/266Clay.md +313 -0
  38. package/knowledge/Furion_Teaching_Manual/30-/350/204/253/346/225/217/350/231/225/347/220/206/357/274/210Sensitive Detection).md" +168 -0
  39. package/knowledge/Furion_Teaching_Manual/32-/346/234/203/350/251/261/345/222/214/347/213/200/346/205/213/347/256/241/347/220/206.md +147 -0
  40. package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md +98 -0
  41. package/knowledge/Furion_Teaching_Manual/34-2-Docker/351/203/250/347/275/262.md +313 -0
  42. package/knowledge/Furion_Teaching_Manual/34-3-Nginx/351/203/250/347/275/262.md +157 -0
  43. package/knowledge/Furion_Teaching_Manual/34-8-WindowsService/351/203/250/347/275/262.md +112 -0
  44. package/knowledge/Furion_Teaching_Manual/35-1-Docker/347/222/260/345/242/203/346/214/201/347/272/214/351/203/250/347/275/262Jenkins.md +169 -0
  45. package/knowledge/Furion_Teaching_Manual/36-1-/345/226/256/345/205/203/346/270/254/350/251/246/346/225/264/345/220/210/346/270/254/350/251/246.md +275 -0
  46. package/knowledge/Furion_Teaching_Manual/36-3-/345/237/272/346/272/226/346/270/254/350/251/246Benchmarking.md +80 -0
  47. package/knowledge/attributes.md +153 -0
  48. package/knowledge/config.md +147 -0
  49. package/knowledge/entity.md +115 -0
  50. package/knowledge/event.md +124 -0
  51. package/knowledge/plugin.md +136 -0
  52. package/knowledge/service.md +146 -0
  53. package/knowledge/sqlsugar.md +172 -0
  54. package/knowledge/vue-typescript.md +338 -0
  55. package/package.json +3 -2
@@ -0,0 +1,295 @@
1
+ # 25. 輔助角色服務(Worker Service)
2
+
3
+ ---
4
+
5
+ ## 25.1 概述
6
+
7
+ .NET Core 3.0+ 提供 Worker Service 專案範本,可編寫長時間執行的背景服務,並部署為 Windows 服務或 Linux 守護程式。
8
+
9
+ 兩種建立方式:
10
+
11
+ | 方式 | 特點 | 推薦 |
12
+ |------|------|------|
13
+ | **共宿主方式** | 在現有 Web 應用中建立,與應用共存亡 | 中小型專案 |
14
+ | **獨立 Worker Service** | 獨立專案、獨立部署、獨立生命週期 | 中大型專案 |
15
+
16
+ ---
17
+
18
+ ## 25.2 共宿主方式
19
+
20
+ ```csharp
21
+ public class Worker : BackgroundService
22
+ {
23
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
24
+ {
25
+ while (!stoppingToken.IsCancellationRequested)
26
+ {
27
+ Console.WriteLine(DateTime.Now);
28
+ await Task.Delay(1000, stoppingToken);
29
+ }
30
+ }
31
+ }
32
+
33
+ // 註冊
34
+ services.AddHostedService<Worker>();
35
+ ```
36
+
37
+ ### 最佳實踐
38
+
39
+ 建立獨立類別庫 `YourProject.BackgroundServices`,引用 Application / Core 層,透過 `AppStartup` 統一註冊:
40
+
41
+ ```csharp
42
+ namespace YourProject.BackgroundServices;
43
+
44
+ public sealed class Startup : AppStartup
45
+ {
46
+ public void ConfigureServices(IServiceCollection services)
47
+ {
48
+ services.AddHostedService<Worker>();
49
+ services.AddHostedService<Worker2>();
50
+ }
51
+ }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## 25.3 獨立 Worker Service
57
+
58
+ ### 25.3.1 建立專案
59
+
60
+ 透過 Visual Studio 的 **Worker Service** 範本建立。
61
+
62
+ ### 25.3.2 基本 Worker
63
+
64
+ ```csharp
65
+ public class Worker : BackgroundService
66
+ {
67
+ private readonly ILogger<Worker> _logger;
68
+ public Worker(ILogger<Worker> logger) => _logger = logger;
69
+
70
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
71
+ {
72
+ while (!stoppingToken.IsCancellationRequested)
73
+ {
74
+ _logger.LogInformation("Worker running at: {time}", DateTime.Now);
75
+ await Task.Delay(1000, stoppingToken);
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ ### 25.3.4 生命週期
82
+
83
+ | 方法 | 說明 |
84
+ |------|------|
85
+ | `StartAsync` | 啟動,不可阻塞 |
86
+ | `ExecuteAsync` | 核心業務邏輯,不可呼叫阻塞程式碼 |
87
+ | `StopAsync` | 停止,不可阻塞 |
88
+
89
+ ### 25.3.5 整合 Furion
90
+
91
+ **.NET 5~7:**
92
+
93
+ ```csharp
94
+ public static IHostBuilder CreateHostBuilder(string[] args) =>
95
+ Host.CreateDefaultBuilder(args)
96
+ .Inject()
97
+ .ConfigureServices((hostContext, services) =>
98
+ {
99
+ // Furion 自動掃描並註冊 Worker,無需手動 AddHostedService
100
+ });
101
+ ```
102
+
103
+ **.NET 8+:**
104
+
105
+ ```csharp
106
+ var builder = Host.CreateApplicationBuilder(args).Inject();
107
+ // Furion 自動註冊 Worker;Inject(false) 可關閉自動註冊
108
+ var host = builder.Build();
109
+ host.Run();
110
+ ```
111
+
112
+ > `Inject()` 預設註冊了日誌、快取、相依性注入、載入設定、自訂 Startup 功能。整合後會自動掃描 `public` 的 Worker 類。
113
+
114
+ ### 25.3.6 註冊服務
115
+
116
+ ```csharp
117
+ // .NET 8+
118
+ var builder = Host.CreateApplicationBuilder(args).Inject();
119
+ builder.Services.AddDatabaseAccessor(options => options.AddDb<DefaultDbContext>());
120
+ builder.Services.AddHttpRemote();
121
+ var host = builder.Build();
122
+ host.Run();
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 25.4 實現簡單定時任務
128
+
129
+ > 強烈建議使用 **26.1 排程作業** 實現強大的分散式定時任務。
130
+
131
+ ### 25.4.1 間隔執行
132
+
133
+ ```csharp
134
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
135
+ {
136
+ while (!stoppingToken.IsCancellationRequested)
137
+ {
138
+ await Task.Delay(1000, stoppingToken);
139
+
140
+ var taskFactory = new TaskFactory(TaskScheduler.Current);
141
+ await taskFactory.StartNew(async () =>
142
+ {
143
+ // 業務程式碼
144
+ _logger.LogInformation("Worker running at: {time}", DateTime.Now);
145
+ await Task.CompletedTask;
146
+ }, stoppingToken);
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### 25.4.2 Cron 表達式執行
152
+
153
+ ```csharp
154
+ using Furion.TimeCrontab;
155
+
156
+ private readonly Crontab _crontab;
157
+
158
+ public Worker(ILogger<Worker> logger)
159
+ {
160
+ _logger = logger;
161
+ _crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds);
162
+ }
163
+
164
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
165
+ {
166
+ while (!stoppingToken.IsCancellationRequested)
167
+ {
168
+ await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);
169
+
170
+ var taskFactory = new TaskFactory(TaskScheduler.Current);
171
+ await taskFactory.StartNew(async () =>
172
+ {
173
+ _logger.LogInformation("Worker running at: {time}", DateTime.Now);
174
+ await Task.CompletedTask;
175
+ }, stoppingToken);
176
+ }
177
+ }
178
+ ```
179
+
180
+ ### 25.4.3 串行執行(等待上次完成)
181
+
182
+ ```csharp
183
+ private bool _isLock = false;
184
+
185
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
186
+ {
187
+ while (!stoppingToken.IsCancellationRequested)
188
+ {
189
+ if (_isLock) goto next;
190
+ _isLock = true;
191
+
192
+ var taskFactory = new TaskFactory(TaskScheduler.Current);
193
+ var task = await taskFactory.StartNew(async () =>
194
+ {
195
+ await Task.Delay(2000); // 模擬耗時操作
196
+ _logger.LogInformation("Worker running at: {time}", DateTime.Now);
197
+ await Task.CompletedTask;
198
+ }, stoppingToken);
199
+
200
+ await task.ContinueWith(t => _isLock = false);
201
+
202
+ next:
203
+ await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);
204
+ }
205
+ }
206
+ ```
207
+
208
+ ---
209
+
210
+ ## 25.5 相依性注入
211
+
212
+ Worker 僅提供**單例**作用域注入。需使用瞬時或作用域服務時,手動建立作用域:
213
+
214
+ ```csharp
215
+ public class Worker : BackgroundService
216
+ {
217
+ private readonly ILogger<Worker> _logger;
218
+ private readonly IServiceScopeFactory _scopeFactory;
219
+
220
+ public Worker(ILogger<Worker> logger, IServiceScopeFactory scopeFactory)
221
+ {
222
+ _logger = logger;
223
+ _scopeFactory = scopeFactory;
224
+ }
225
+
226
+ protected override Task ExecuteAsync(CancellationToken stoppingToken)
227
+ {
228
+ // 高頻場景:作用域放迴圈外
229
+ using var scope = _scopeFactory.CreateScope();
230
+ var services = scope.ServiceProvider;
231
+
232
+ while (!stoppingToken.IsCancellationRequested)
233
+ {
234
+ // 低頻場景:作用域放迴圈內
235
+ // using var scope = _scopeFactory.CreateScope();
236
+
237
+ var dbContext = Db.GetDbContext(services);
238
+ var repository = Db.GetRepository<Person>(services);
239
+ var otherService = services.GetService<XXX>();
240
+ }
241
+
242
+ return Task.CompletedTask;
243
+ }
244
+ }
245
+ ```
246
+
247
+ ---
248
+
249
+ ## 25.6 部署
250
+
251
+ ### 共宿主方式
252
+
253
+ 直接部署所在的 Web 應用即可。部署到 IIS 時需注意回收問題(參見 34.1.5)。
254
+
255
+ ### 部署到 Windows Service
256
+
257
+ 1. 安裝 `Microsoft.Extensions.Hosting.WindowsServices`
258
+ 2. 新增 `.UseWindowsService()`:
259
+
260
+ ```csharp
261
+ Host.CreateDefaultBuilder(args)
262
+ .UseWindowsService()
263
+ .Inject()
264
+ .ConfigureServices((ctx, services) => { });
265
+ ```
266
+
267
+ 3. 發佈:`dotnet publish -c Release -o C:\FurionWorker`
268
+ 4. 以**管理員**模式操作:
269
+
270
+ ```bash
271
+ sc.exe create FurionWorkerServices binPath= C:\FurionWorker\FurionWorker.exe
272
+ sc.exe start FurionWorkerServices
273
+ sc.exe stop FurionWorkerServices
274
+ sc.exe delete FurionWorkerServices
275
+ ```
276
+
277
+ > `=` 後面須有空格。刪除服務前請先關閉 Windows 服務工具。推薦參考 34.8 章節的新部署方式。
278
+
279
+ ### 部署到 Linux 守護程式
280
+
281
+ 1. 安裝 `Microsoft.Extensions.Hosting.Systemd`
282
+ 2. 新增 `.UseSystemd()`:
283
+
284
+ ```csharp
285
+ Host.CreateDefaultBuilder(args)
286
+ .UseSystemd()
287
+ .Inject()
288
+ .ConfigureServices((ctx, services) => { });
289
+ ```
290
+
291
+ ---
292
+
293
+ ## 25.7 Windows 部署日誌問題
294
+
295
+ 預設部署為 Windows Service 後,日誌檔案可能寫入 `System32` 目錄。若使用 Furion 的 `AddFileLogging`,可嘗試以 `AppDomain.CurrentDomain.BaseDirectory` 作為日誌寫入目錄。