Files
petwash/PetWashControl/PROJECT_STRUCTURE.md
GukSang.Jin 9c66b6cd82
2026-03-03 16:55:02 +08:00

4.9 KiB
Raw Blame History

PetWashControl 项目结构说明

文件夹组织

PetWashControl/
├── Converters/              # 值转换器
│   └── BoolToStatusConverter.cs
├── Models/                  # 数据模型
│   ├── Order.cs
│   └── Package.cs
├── Services/                # 业务服务层
│   ├── ApiService.cs       # API通信服务
│   ├── MqttClientService.cs # MQTT客户端服务
│   ├── ConfigurationService.cs # 配置管理
│   └── LogService.cs       # 日志服务
├── ViewModels/              # 视图模型MVVM
│   └── MainViewModel.cs
├── Views/                   # 视图XAML界面
│   ├── MainWindow.xaml
│   └── MainWindow.xaml.cs
├── Resources/               # 资源文件
│   └── Styles.xaml         # 样式定义
├── App.xaml                 # 应用程序入口
├── App.xaml.cs
└── AssemblyInfo.cs

架构模式

MVVM (Model-View-ViewModel)

  • Model: 数据模型定义业务实体Package, Order
  • View: XAML界面负责UI展示
  • ViewModel: 视图模型,处理业务逻辑和数据绑定

依赖注入

使用构造函数注入服务依赖:

  • ConfigurationService: 配置管理
  • ApiService: HTTP API通信
  • MqttClientService: MQTT消息通信
  • LogService: 日志记录

核心组件

1. Services服务层

ApiService

  • 负责与后端API通信
  • 提供套餐查询、订单管理等接口
  • 统一异常处理

MqttClientService

  • MQTT客户端封装
  • 订阅设备状态和命令主题
  • 自动重连机制

ConfigurationService

  • 集中管理配置参数
  • API地址、MQTT连接信息等

LogService

  • 日志记录到文件和调试窗口
  • 按日期分割日志文件

2. ViewModels视图模型

MainViewModel

  • 使用 CommunityToolkit.Mvvm 实现MVVM
  • ObservableProperty: 自动属性通知
  • RelayCommand: 命令绑定
  • 业务流程控制

3. Converters值转换器

BoolToStatusConverter

  • 将布尔值转换为状态文本
  • 用于UI显示

4. Resources资源

Styles.xaml

  • 统一的UI样式定义
  • 颜色主题
  • 按钮、文本等控件样式

NuGet 依赖包

<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageReference Include="MQTTnet" Version="4.3.7.1207" />
<PackageReference Include="System.Net.Http.Json" Version="8.0.1" />
<PackageReference Include="System.Text.Json" Version="8.0.5" />

包说明

  • CommunityToolkit.Mvvm: MVVM框架提供ObservableObject、RelayCommand等
  • MQTTnet: MQTT客户端库4.3.7版本)
  • Microsoft.Extensions.Hosting: 依赖注入和托管服务
  • System.Net.Http.Json: HTTP JSON扩展方法
  • System.Text.Json: JSON序列化

版本兼容性说明

MQTTnet 4.3.7 重要变更

  1. ConnectAsync: 需要传入 CancellationToken 参数

    await _mqttClient.ConnectAsync(_options, CancellationToken.None);
    
  2. SubscribeAsync: 使用 Builder 模式

    var subscribeOptions = new MqttClientSubscribeOptionsBuilder()
        .WithTopicFilter("device/status")
        .WithTopicFilter("device/command")
        .Build();
    await _mqttClient.SubscribeAsync(subscribeOptions, CancellationToken.None);
    
  3. PublishAsync: 需要传入 CancellationToken 参数

    await _mqttClient.PublishAsync(message, CancellationToken.None);
    
  4. Payload 属性: PayloadSegment 返回 ArraySegment<byte>

    var payloadBytes = args.ApplicationMessage.PayloadSegment.ToArray();
    var payload = Encoding.UTF8.GetString(payloadBytes);
    

数据流

  1. 初始化: MainViewModel.InitializeAsync()

    • 连接MQTT Broker
    • 加载套餐列表
  2. 创建订单: CreateOrderCommand

    • 调用API创建订单
    • 更新UI状态
  3. 支付: SimulatePaymentCommand

    • 确认支付
    • 接收MQTT开门指令
  4. 关门: CloseDoorCommand

    • 发送MQTT关门状态
    • 更新订单状态
    • 接收开始清洗指令
  5. 完成: 自动流程

    • 模拟清洗时间
    • 发送完成状态
    • 更新订单

配置说明

ConfigurationService 默认配置

ApiBaseUrl = "https://localhost:7001/"
MqttBrokerHost = "localhost"
MqttBrokerPort = 1883
MqttClientId = "PetWashControl"
WashSimulationSeconds = 10

日志

日志文件位置: {应用目录}/Logs/log_yyyyMMdd.txt

日志级别:

  • INFO: 一般信息
  • WARN: 警告
  • ERROR: 错误(包含异常堆栈)

开发建议

  1. 新增功能时遵循MVVM模式
  2. 服务层保持单一职责
  3. 使用依赖注入管理服务
  4. 异常处理要友好提示用户
  5. 重要操作记录日志
  6. UI样式统一使用资源字典

扩展点

  • 添加新视图: Views文件夹
  • 添加新服务: Services文件夹
  • 自定义样式: Resources/Styles.xaml
  • 配置参数: ConfigurationService