三端目录与 XFE WinUI 架构
源码按运行职责拆分,解决方案中的分组与物理路径一致:
Server/
XFEWarframe.Server/ ServerInteractive 控制台入口
XFEWarframe.Core/ 游戏 API、存档与业务逻辑
data/ 嵌入程序集的上游静态数据
Tests/XFEWarframe.Tests/
Client/
XFEWarframe.Player/ 玩家 WinUI 应用
XFEWarframe.Client/ C# 安装、检测、恢复、启动逻辑
XFEWarframe.Installer/ C# 命令行安装器
XFEWarframe.Bridge/ C# NativeAOT 游戏兼容组件
Tests/XFEWarframe.Client.Tests/
Admin/
XFEWarframe.Admin/ 管理员 WinUI 应用
根目录的 XFEWarframe.slnx 包含全部工程。也可分别打开三端文件夹内的 Server.slnx、Client.slnx、Admin.slnx。
Visual Studio 的启动项目、非打包 WinUI 调试配置和 x64 映射见 调试说明。
模板来源
采用用户确认的本机模板:
XFEExtension.NetCore.VSIX/XFEExtension.NetCore.VSIX/ProjectTemplates/XFEApplication (WinUI3).zip。
- 本机 VSIX 仓库提交:
b2dfe0d26a81310ef788eefd5ae41eff7c892f1f。 - 模板 SHA-256:
51CDCDA995C986F1E8EB02A59E839B541222D8275C25B334B901860444730BA1。 - 模板结构已按 Warframe 功能改写;未保留演示服务、示例页面或空的演示项目。
- 保留模板的 Apache 2.0 许可,见 许可文件。
两个应用均采用以下实际分层:
| 位置 | 职责 |
|---|---|
| App / MainWindow | 注册页面及服务、应用生命周期、原生窗口与 DPI |
| Views/AppShellPage | 原生 WinUI TitleBar、NavigationView、Frame、消息与加载服务宿主 |
| Views | 独立 XAML 页面;后台代码只绑定 ViewModel、接收导航与控件事件 |
| ViewModels | CommunityToolkit ObservableObject、可观察属性、异步命令与页面状态 |
| Interface/Services | 业务及交互服务契约 |
| Implements/Services | API、客户端安装与启动、文件选择、对话框、配置迁移 |
| Models | 共享应用状态和列表数据 |
| Profiles/CrossVersionProfiles | XFEProfile 持久化主题及各端偏好 |
| Utilities / Styles | 路径、窗口辅助、验证工具、主题资源与控件样式 |
使用模板的 PageManager 注册页面,使用 ServiceManager 和 GlobalServiceBase 管理服务。页面导航由 INavigationViewService、IAutoNavigationParameterService 承载;消息、对话框和加载状态分别接入 IMessageService、IDialogService、ILoadingService。不只采用相同文件夹名称。
固定依赖为 WinUIHelper 1.2.5(模板的 1.2.x 系列)、Windows App SDK 1.8.260804001、CommunityToolkit.Mvvm 8.4.2、AutoConfig 4.1.2。使用 .NET 10 partial properties;主题属性初值使用完整类型名,以兼容配置生成器生成代码的命名空间。
配置与生命周期
管理员配置位于 %LOCALAPPDATA%/XFEWarframe/Admin/Profiles,玩家配置位于 %LOCALAPPDATA%/XFEWarframe/Player/Profiles。两者互不共享。玩家端首次使用时读取旧 Player/settings.json 并迁移游戏目录和服务器地址,保留旧文件;--settings=<旧配置文件> 可显式导入。
管理员令牌只保存在内存,不写入 Profiles。管理员端只在本地地址下自动读取本地服务配置,远程连接通过设置页输入。玩家工程不引用 Admin、Server 或游戏 Core,不调用管理 API。
玩家端的 AccountPage 与 InventoryPage 使用 IPlayerAccountService / PlayerAccountService、独立的 PlayerAccountState 和各自 ViewModel。可测试的 HTTP 协议客户端位于 XFEWarframe.Client/PlayerPortalClient.cs。账号与游戏存档共用,Bearer 会话独立于游戏 nonce。RememberedAccountStore 通过 Windows 用户数据保护加密登录信息,按服务器地址独立存储;XFEProfile 仅保存邮箱和默认开启的 RememberAccount 选项。关闭记住选项或明确退出会清除相应的加密记录。
关闭玩家窗口会先取消正在执行的安装并等待清理/回滚结束。管理员窗口关闭会停止轮询并释放 HTTP 客户端,独立服务器继续运行。两端关闭时刷新 XFEProfile 的待保存写入。
新启动脚本的服务数据默认在 Server/runtime。旧根目录 runtime 的存档没有自动移动或覆盖,正在运行的旧实例不受影响;继续使用旧存档可传 -Root ./runtime,或在停止旧服务器后自行迁入 Server/runtime。
发布与验证
scripts/Publish.ps1 生成三个运行目录及三个独立 ZIP:
Server/Start.cmd:启动 API 控制台服务,数据在同目录的runtime。Client/Start.cmd:玩家应用;命令行安装器在Client/Installer,兼容组件在Client/Bridge。Admin/Start.cmd:管理员应用;连接远程服务器时无需 Server 文件夹,本地启动功能查找同级 Server。
各包保留对应源码、许可证、文档与验证报告,不打包用户存档、管理令牌或个人偏好。
scripts/Smoke-Desktop.ps1 使用临时本地服务器和隔离的 --profile-root,在隐藏窗口中检查全部页面的构造、导航、ViewModel 加载、不同宽度布局、主题和配置保存。不会执行安装、卸载或游戏启动。它不替代真实显示器上的视觉验收。
--verify-ui=<报告路径> 仅用于这项主动触发的验证;正常启动没有测试页面或开发选项。
管理发布与账号交互
管理员新增 MailPage、NewsPage 和各自 ViewModel,复用 IAdminService 调用管理接口。玩家新增 ItemCatalogPage,AccountPage 只展示名片;LoginDialog 与 RegisterDialog 复用 AuthenticationViewModel,弹窗由模板 IDialogService 承载。FooterMenuItems 中显示账号与偏好设置,账号头像与昵称由 PlayerAccountState 共享。权限改变通过可观察状态同步隐藏操作区域。
战甲、普通武器与显赫武器的拖动 MOD 配装共用 Client/SharedUI/ModLoadoutView、EquipmentEditorModel 和编译的 ModLoadoutResources.xaml。原版资源图片由异步 GameAssetImage 显示;数据规则位于 Client/Shared/ModLoadoutRules.cs,服务端保存重复执行相同校验。技能的 AutoSuggestBox 与候选模板共用名称和原版图标。两端只替换 API 传输和账号上下文,不复制配装 UI;详见 配装说明。