5.5 KiB
5.5 KiB
Store.Management 项目架构
定位与实现边界
Store.Management 是需要登录并访问远端 API 的 WPF 门店管理客户端。当前实现包含登录、用户 API、框架能力示例以及管理、商品上架模块的启动骨架;不要把骨架或示例描述为已完成的业务功能。
项目划分
| 路径 | 职责 |
|---|---|
Source/Store.Management/ |
应用宿主、登录窗口、主窗口、示例页面与容器注册 |
Source/Store.Management.Framework/ |
WPF 基础控件、应用生命周期、配置目录、配置服务、日志与工具 |
Source/Store.Management.Api/ |
RestSharp API 客户端、认证会话、用户接口、DTO 与传输错误 |
Source/Core/MAX.Core/ |
通用工具、Autofac 注册、类型发现与通知集成 |
Source/Core/MAX.Framework/ |
Prism/Autofac 适配、命令、弹窗基类与日志封装 |
Source/Core/MAX.Notification/ |
通知契约、发布器与处理器分发 |
Source/Modules/Store.Admin/ |
管理模块骨架,目前通过项目引用依赖 Framework |
Source/Modules/Store.ListingProduct/ |
商品上架模块骨架,目前通过项目引用依赖 Framework |
Tests/ |
可执行的冒烟测试项目 |
- 通用 Core 不反向依赖 Store 项目;API 层保持与 WPF 视图解耦。
- 共用客户端基础设施放 Framework,接口通信放 Api,具体业务放对应模块。
- 当前宿主没有引用上述两个业务模块;模块只有
IStartup骨架。新增模块功能时核实程序集加载、注册和导航链路,不假设已自动接入。 - 不为遵守规则而新增数据库、ORM、图表、视频或文档生成依赖;当前仓库没有这些业务实现。
技术与配置依据
Directory.Build.props默认net8.0-windows、C#14.0、隐式 using、Nullable annotations;各项目可以覆盖。- Core 与 Notification 中有
net8.0项目;业务模块和部分测试覆盖为net10.0/net10.0-windows。依据各.csproj,不将整个解决方案误写为同一目标框架,也不擅自统一。 - UI 使用 Prism.Wpf 和仓库内的 Autofac 适配,控件使用官方
HandyControl与MAX.Common.WPF;具体版本以项目文件为准。 - API 使用 RestSharp 与 System.Text.Json;JSON 配置服务使用 Newtonsoft.Json;日志使用 NLog。
- 应用入口为
App : FrameworkApplication,后者继承Prism.Autofac.PrismApplication。维护现有启动、登录成功切换主窗口及退出释放客户端的流程。
数据、目录与生命周期
- 所有 HTTP 请求复用
StoreApiClient/ApiTransport,不在 ViewModel 中另起传输实现。 - 路径复用
FolderConfig,配置复用JsonSettingsServiceBase<T>;读取路径不应触发不必要的文件创建。 - 当前
FolderConfig.AppName是StoreManagement,应用数据目录实际为%LOCALAPPDATA%/StoreManagement;不要根据类注释或程序集名猜目录,也不要无迁移方案改名。 - 保持配置保存的串行化、同目录临时文件替换、失败保留原模型行为。
- 普通业务失败交给调用方展示;致命错误复用
ApplicationLogService/FrameworkApplication.Fatal。不要吞掉错误或把取消当作致命故障。
验证方式
C#、XAML 或项目依赖变更后,构建受影响项目并运行相关冒烟测试。以下命令均在仓库根目录执行:
dotnet build Store.Management.slnx
dotnet run --project Tests/MAX.Core.SmokeTests/MAX.Core.SmokeTests.csproj
dotnet run --project Tests/MAX.Notification.SmokeTests/MAX.Notification.SmokeTests.csproj
dotnet run --project Tests/Store.Management.Api.SmokeTests/Store.Management.Api.SmokeTests.csproj
dotnet run --project Tests/Store.Management.Framework.SmokeTests/Store.Management.Framework.SmokeTests.csproj
dotnet run --project Tests/Store.Management.App.SmokeTests/Store.Management.App.SmokeTests.csproj
- 这些测试是控制台可执行程序,不能仅以
dotnet test无失败判断测试已运行。 - Framework 和 App 冒烟测试未列入当前解决方案,按项目路径单独执行;WPF 测试需要 Windows,部分项目需要 .NET 10 SDK。
- 纯规则文档修改检查引用和内容即可,无需启动应用或全量构建。
- 遇到 SDK、还原或文件锁定问题,报告具体阻碍;不要擅自终止用户进程或把失败报告为通过。
API 与业务契约
- 复用
IAuthApi的登录、退出、当前用户接口及IUserApi的查询、新增、更新接口;保持现有路由大小写、HTTP 方法与参数位置。 - 登录窗口当前按服务端契约对 UTF-8 密码计算 32 位大写 MD5 后提交,保留密码首尾空格。不把该转换推广为其他用途的密码存储策略。
- TokenSession 只存内存,不将密码或 Token 写入配置、日志或用户资料 DTO;保持登录/退出串行及旧请求 401 不清除新会话的行为。
- ApiResult 的业务成功码为 200;HTTP 成功不等于业务成功。分页使用 Page、PageSize 与 Total、Items;保留 DTO DataAnnotations 的长度及范围限制。
- 用户名与昵称分别对应 UserName、NickName;积分与可空余额使用 DTO 的 decimal 类型,区分 null 与 0。不自行推断 GroupId、ParentUserName 的权限语义。
- ApiTransport 是统一传输出口,负责相对路由、版本、认证头、校验、取消与错误分类;保留 ApiException 的类型、状态和追踪信息。
- ProductSavedNotification 是框架示例,不证明商品业务已接入。新增商品字段、上架状态或权限须依据具体需求与服务端契约。