DC娱乐网

谁说 .NET 桌面过时了?AI 协作开发 WPF + SQLite 监控工具

前言在"云原生""微服务""跨端框架"盛行的今天,不少人认为 .NET 桌面开发已成昨日黄花。然而,技术的价值从不在于流
前言

在"云原生""微服务""跨端框架"盛行的今天,不少人认为 .NET 桌面开发已成昨日黄花。然而,技术的价值从不在于流行与否,而在于是否真正解决问题。

本文推荐一个监控工具——它没有 Web 后端、没有 Docker、没有复杂的部署流程,只有一个.exe 文件,双击即用。整个项目在开发过程中大量借助 AI 工具辅助生成代码、设计数据库结构、编写 SQL 脚本和文档,但运行时完全不依赖任何 AI 服务。这是一次对"轻量、本地、高效"开发理念的实践,也是一次对 WPF 现代能力的重新审视。

项目介绍

项目是一个面向个人开发或运维人员的本地监控工具,用于定期检查数据库指标或 API 接口状态,并在异常时发出预警。

V1 版本采用典型的前后端分离架构:Vue 前端 + .NET WebAPI + MySQL + Docker 部署。虽然功能完整,但对单人使用来说过于笨重。

于是彻底重构为 V2:将所有逻辑内嵌到一个 WPF 应用中,使用 SQLite 作为本地存储,通过 Quartz.NET 实现任务调度,真正做到"开箱即用"。

项目功能

1、支持配置多种数据库连接(MySQL、SQL Server),用于执行自定义 SQL 查询;

2、支持调用 HTTP API 并解析返回结果;

3、可设置灵活的预警规则,包括判断条件、阈值、Cron 表达式等;

4、提供统计看板,以图表形式展示关键指标趋势;

5、预警信息实时显示,支持忽略、恢复、查看详情;

6、程序最小化至系统托盘,支持悬浮窗、开机自启等桌面友好特性;

7、所有配置数据本地保存,无需网络,保障隐私与安全。

项目特点

最突出的特点是"极简"。相比 V1 的多组件协作,V2 将一切收敛到单一 WPF 进程中。无需安装数据库、配置反向代理或管理容器,下载即用。

同时,项目结构清晰,分层合理:领域模型、数据访问、UI 逻辑各司其职,便于后续维护或扩展。另外,借助 HandyControl 和 LiveCharts2,界面虽为桌面应用,却具备现代感和交互流畅性。

项目技术V2 架构变更说明

相比 V1 版本,V2 采用极简架构:

对比项

V1

V2

后端服务

.NET 8 WebAPI

移除

管理端

Vue 3 Web

移除

配置存储

MySQL

SQLite(本地)

任务调度

API 内 Quartz

WPF 内嵌 Quartz

部署方式

Docker Compose

单体 WPF 安装

V2 核心理念:一个 WPF 桌面程序包含所有功能,启动即运行。

技术栈概览

层级

技术选型

版本

桌面客户端

WPF

.NET 8.0

本地数据库

SQLite

3.x

ORM

Dapper

2.1+

定时调度

Quartz.NET

3.8+

HTTP 客户端

HttpClient

内置

MVVM 框架

CommunityToolkit.Mvvm

8.2+

UI 组件库

HandyControl

3.5+

图表组件

LiveCharts2

2.0+

解决方案结构├── src/│ ├── xxx.WPF/ # WPF 桌面客户端(主入口)│ │ ├── Views/ # 视图│ │ ├── ViewModels/ # 视图模型│ │ ├── Services/ # 服务层│ │ │ ├── Scheduler/ # Quartz 调度服务│ │ │ ├── Executor/ # 预警/统计执行器│ │ │ └── Notification/ # 通知服务│ │ └── App.xaml│ ││ ├── xxx.Domain/ # 领域模型│ │ ├── Entities/ # 实体│ │ ├── Enums/ # 枚举(含 SystemCategory)│ │ └── Interfaces/ # 仓储接口│ ││ ├── xxx.Repository/ # 数据访问层│ │ ├── SqliteContext.cs # SQLite 连接管理│ │ └── Repositories/ # 仓储实现│ ││ └── xxx.Shared/ # 共享工具类│ ├── Extensions/ # 扩展方法│ ├── Helpers/ # 辅助类│ └── Constants/ # 常量└── docs/├── prd/│ ├── PRDv2.md│ └── v2/ # HTML 原型└── 技术选型v2.md各层职责

项目

职责

依赖

xxx.Shared

通用工具、扩展方法、常量

xxx.Domain

实体、枚举、仓储接口

Shared

xxx.Repository

SQLite 数据访问、Dapper 查询

Domain, Shared

xxx.WPF

UI、业务逻辑、Quartz 调度

全部

项目代码定时任务调度Quartz.NET 内嵌调度服务publicSchedulerService : IHostedService{privatereadonly IScheduler _scheduler;privatereadonly IAlertRuleRepository _ruleRepo;public SchedulerService(ISchedulerFactory schedulerFactory,IAlertRuleRepository ruleRepo){_scheduler = schedulerFactory.GetScheduler.Result;_ruleRepo = ruleRepo;}public async Task StartAsync(CancellationToken cancellationToken){await _scheduler.Start(cancellationToken);await LoadAllJobs;}public async Task StopAsync(CancellationToken cancellationToken){await _scheduler.Shutdown(cancellationToken);}private async Task LoadAllJobs{var rules = await _ruleRepo.GetEnabledRulesAsync;foreach (var rule in rules){await ScheduleJob(rule);}}public async Task ScheduleJob(AlertRule rule){var job = JobBuilder.Create.WithIdentity($"alert-{rule.Id}").UsingJobData("RuleId", rule.Id).Build;var trigger = TriggerBuilder.Create.WithIdentity($"trigger-{rule.Id}").WithCronSchedule(rule.CronExpression).Build;await _scheduler.ScheduleJob(job, trigger);}public async Task RemoveJob(int ruleId){await _scheduler.DeleteJob(new JobKey($"alert-{ruleId}"));}public async Task PauseAll{await _scheduler.PauseAll;}public async Task ResumeAll{await _scheduler.ResumeAll;}}预警检查任务publicAlertCheckJob : IJob{privatereadonly IAlertRuleRepository _ruleRepo;privatereadonly IAlertExecutor _executor;privatereadonly ICurrentAlertRepository _alertRepo;public async Task Execute(IJobExecutionContext context){var ruleId = context.JobDetail.JobDataMap.GetInt("RuleId");var rule = await _ruleRepo.GetByIdAsync(ruleId);if (rule == null || !rule.Enabled) return;var result = await _executor.ExecuteAsync(rule);await ProcessResult(rule, result);}private async Task ProcessResult(AlertRule rule, ExecuteResult result){// 更新规则执行状态rule.LastRunTime = DateTime.Now;rule.LastRunSuccess = result.Success;rule.LastRunResult = result.Message;if (result.ShouldAlert){await _alertRepo.AddOrUpdateAlertAsync(rule, result);}else{await _alertRepo.TryRecoverAlertAsync(rule.Id);}await _ruleRepo.UpdateAsync(rule);}}项目效果

启动时间在 1 秒内,内存占用约 80MB,后台定时任务精准可靠。用户可在主界面快速添加一条"每5分钟检查订单表是否有积压"的规则,或配置"API 响应时间超过 2 秒即告警"。

一旦触发,托盘图标会显示预警数量,点击即可查看详情。所有数据保存在用户本地 AppData 目录下的 data.db 文件中,卸载即清理,无残留。对于需要在自己电脑上监控多个服务状态的开发者来说,它比搭建一套 Web 监控系统更直接、更高效。

项目监控

当前预警

已忽略预警

预警规则

统计图表

系统设置

Web端AI生成的原型图项目源码

项目已开源,结构清晰,包含完整的解决方案文件、分层代码、数据库初始化脚本及技术文档。可直接克隆仓库,用 Visual Studio 2022 打开,一键运行调试。

为了防止丢失,可以在评论区留言关键字「监控工具」,即可获取完整源码地址。

总结

在合适的场景下,一个简洁、专注、本地化的桌面应用,依然具有不可替代的价值。.NET 桌面开发从未过时,只是需要更聪明的用法。未来,我们或许会为它加入更多数据源支持或插件机制,但核心理念不变:轻量、可靠、开箱即用。

关键词

、.NET 8、、Quartz.NET、、、、、、

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠]社区,与其他热爱技术的同行一起交流心得,共同成长!

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END

方便大家交流、资源共享和共同成长纯技术交流群,需要加入的小伙伴请扫码,并备注【加群】

推荐阅读

觉得有收获?不妨分享让更多人受益

关注「DotNet技术匠」,共同提升技术实力