diff --git a/.github/instructions/prompt.instructions.md b/.github/instructions/prompt.instructions.md index d0b9ea2..5c40632 100644 --- a/.github/instructions/prompt.instructions.md +++ b/.github/instructions/prompt.instructions.md @@ -3,6 +3,52 @@ applyTo: '**' --- - 说中文 - 这是一个基于Avalonia的项目管理工程,目标是让非程序员也能轻松使用luban管理配置表。 +- 命令行是PowerShell使用分号作为命令分隔符 + +## 架构说明 + +### 🏗️ LubanHub.Core 核心能力库 +LubanHub.Core 提供了项目的底层核心能力,**优先使用这些服务**来实现功能,避免重复造轮子: + +#### 📥 下载服务 (ICoreDownloadService) +- **默认下载目录**: 系统用户数据目录的LubanHub子目录 (`%AppData%\LubanHub\Downloads`) +- **目录管理**: 获取/设置下载目录 +- **进度追踪**: 实时下载进度、速度、文件名显示 +- **取消支持**: 支持CancellationToken取消下载 +- **使用场景**: Luban版本下载、模板下载、资源文件下载 + +#### 📁 文件管理服务 (ICoreFileService) +- **文件操作**: 创建、删除、复制、移动文件 +- **目录操作**: 创建、删除、遍历目录 +- **异步读写**: ReadAllTextAsync/WriteAllTextAsync +- **信息获取**: FileInfo/DirectoryInfo +- **使用场景**: 配置文件操作、项目文件管理、模板文件处理 + +#### ⚙️ 进程调用服务 (ICoreProcessService) +- **同步执行**: 等待进程完成并获取输出 +- **异步执行**: 实时获取stdout/stderr输出 +- **后台进程**: 启动但不等待的进程 +- **进程管理**: 检查进程状态、杀死进程 +- **使用场景**: 调用Luban命令行、Git操作、外部工具集成 + +#### 🗜️ 解压缩服务 (ICoreCompressionService) +- **ZIP支持**: 完整的ZIP解压缩功能 +- **进度追踪**: 解压进度回调 +- **格式检测**: 自动识别压缩格式 +- **扩展支持**: 预留RAR/7Z接口(需第三方库) +- **使用场景**: Luban安装包解压、模板包解压、资源包处理 + +#### 🔧 依赖注入集成 +```csharp +// 在App.axaml.cs中已配置 +services.AddCoreServices(); // 自动注册所有Core服务 +``` + +#### ⚠️ 扩展原则 +- **优先使用**: 实现新功能时,首先检查Core是否已提供相关服务 +- **必要扩展**: 只有在Core无法满足需求时,才考虑扩展Core +- **接口设计**: 新增Core功能需要定义接口,保持架构一致性 +- **日志集成**: 所有Core服务已集成Microsoft.Extensions.Logging ## UI设计规范 @@ -61,4 +107,41 @@ applyTo: '**' - 按钮支持按下状态反馈 - 输入框支持焦点状态 - 列表项支持选中和悬停状态 -- 过渡动画让交互更流畅 \ No newline at end of file +- 过渡动画让交互更流畅 + +## 开发指导 + +### 📋 功能实现流程 +1. **需求分析**: 明确功能需求和用户场景 +2. **Core检查**: 检查LubanHub.Core是否已提供相关服务 +3. **服务利用**: 优先使用Core服务实现功能逻辑 +4. **UI设计**: 按照设计规范创建用户界面 +5. **进度显示**: 长时间操作使用底部进度条显示状态 +6. **错误处理**: 合理的异常处理和用户提示 + +### 🎯 常见场景示例 +- **文件下载**: 使用ICoreDownloadService,进度显示在底部 +- **Luban调用**: 使用ICoreProcessService执行命令行 +- **配置管理**: 使用ICoreFileService读写配置文件 +- **安装包处理**: 使用ICoreCompressionService解压 +- **目录选择**: 集成系统文件对话框(需要时扩展Core) + +### 🔄 服务扩展指南 +当需要新功能且Core无法满足时: +1. 在`LubanHub.Core/Interfaces`添加接口定义 +2. 在`LubanHub.Core/Services`添加实现类 +3. 在`ServiceCollectionExtensions`中注册服务 +4. 更新本文档说明新增能力 +5. 在App层通过依赖注入使用新服务 + +### 📊 UI状态管理 +- **ViewModelBase**: 所有ViewModel继承此基类 +- **属性绑定**: 使用SetProperty方法通知UI更新 +- **命令模式**: 使用RelayCommand处理用户交互 +- **进度显示**: 使用DownloadProgressViewModel显示长时间操作 + +### 🎨 主题和样式 +- **主题切换**: 使用ThemeManager管理深色/浅色主题 +- **资源绑定**: 所有颜色使用DynamicResource绑定 +- **样式复用**: 在Styles.axaml中定义通用样式 +- **响应式**: 支持运行时主题切换 \ No newline at end of file diff --git a/LubanHub.sln b/LubanHub.sln index 8c81659..6abfaf7 100644 --- a/LubanHub.sln +++ b/LubanHub.sln @@ -7,6 +7,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{06401A04-D86 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LubanHub.App", "src\LubanHub.App\LubanHub.App.csproj", "{9A66E728-EA8A-4644-9CC2-2C056479AF5A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LubanHub.Core", "src\LubanHub.Core\LubanHub.Core.csproj", "{B8F5E9A2-1234-4567-890A-BCDEF0123456}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -20,8 +22,13 @@ Global {9A66E728-EA8A-4644-9CC2-2C056479AF5A}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A66E728-EA8A-4644-9CC2-2C056479AF5A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A66E728-EA8A-4644-9CC2-2C056479AF5A}.Release|Any CPU.Build.0 = Release|Any CPU + {B8F5E9A2-1234-4567-890A-BCDEF0123456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B8F5E9A2-1234-4567-890A-BCDEF0123456}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8F5E9A2-1234-4567-890A-BCDEF0123456}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B8F5E9A2-1234-4567-890A-BCDEF0123456}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {9A66E728-EA8A-4644-9CC2-2C056479AF5A} = {06401A04-D861-4FAC-988F-C06E2D5AC553} + {B8F5E9A2-1234-4567-890A-BCDEF0123456} = {06401A04-D861-4FAC-988F-C06E2D5AC553} EndGlobalSection EndGlobal diff --git a/design/项目架构设计.md b/design/项目架构设计.md index cf23975..e3dedfa 100644 --- a/design/项目架构设计.md +++ b/design/项目架构设计.md @@ -82,9 +82,37 @@ UI层 --- -## 五、开发建议 +## 五、架构原则 + +### 1. 服务注册原则 +- **优先使用装饰器注册服务**:所有服务类使用 `[RegistService]` 特性标记,实现自动发现和注册 +- **避免手工注册**:减少在 DI 容器中手动添加服务,降低耦合度和维护成本 +- **支持生命周期配置**:通过装饰器参数指定服务生命周期(Singleton/Scoped/Transient) + +### 2. 依赖方向原则 +- **LubanHub.Core 不能引用任何其他服务**:作为基础能力库,Core 必须保持纯净,只能依赖系统库和第三方基础库 +- **其他服务可以引用 Core**:业务服务层可以依赖 Core 提供的基础能力 +- **业务服务间避免相互引用**:各业务服务应保持独立,通过事件或接口解耦 + +### 3. 接口设计原则 +- **Core 服务必须定义接口**:如 `ICoreFileService`、`ICoreDownloadService` 等 +- **业务服务建议定义接口**:便于测试和扩展 +- **接口与实现分离**:接口放在 Interfaces 目录,实现放在 Services 目录 + +### 4. 装饰器使用示例 +```csharp +[RegistService(ServiceLifetime.Singleton, typeof(ICoreFileService))] +public class CoreFileService : ICoreFileService +{ + // 服务实现 +} +``` + +--- + +## 六、开发建议 -- 每个服务建议定义接口(如 IFileService),便于测试和扩展 - Core层实现时注意跨平台兼容 - 业务服务只依赖Core,不直接操作系统API - UI层只做展示和交互,所有逻辑下沉到服务 +- 使用装饰器模式实现服务的自动发现和注册 diff --git a/src/LubanHub.App/App.axaml.cs b/src/LubanHub.App/App.axaml.cs index 803b3b9..39a0623 100644 --- a/src/LubanHub.App/App.axaml.cs +++ b/src/LubanHub.App/App.axaml.cs @@ -1,17 +1,29 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; +using LubanHub.App.Services; +using LubanHub.Core; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using System; namespace LubanHub.App; public partial class App : Application { + public static ServiceProvider? ServiceProvider { get; private set; } + public override void Initialize() { try { Console.WriteLine("正在初始化应用程序..."); + + // 配置服务 + var services = new ServiceCollection(); + ConfigureServices(services); + ServiceProvider = services.BuildServiceProvider(); + AvaloniaXamlLoader.Load(this); Console.WriteLine("XAML加载完成。"); } @@ -23,6 +35,27 @@ public partial class App : Application } } + private static void ConfigureServices(ServiceCollection services) + { + // 添加日志 + services.AddLogging(builder => + { + builder.AddConsole(); + builder.SetMinimumLevel(LogLevel.Debug); + }); + + // 添加Core服务 + services.AddCoreServices(); + + // 添加App层服务 + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + // 添加ViewModels等其他服务 + // services.AddSingleton(); + } + public override void OnFrameworkInitializationCompleted() { try @@ -31,6 +64,7 @@ public partial class App : Application if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { desktop.MainWindow = new MainWindow(); + desktop.Exit += (s, e) => ServiceProvider?.Dispose(); Console.WriteLine("主窗口已创建。"); } diff --git a/src/LubanHub.App/LubanHub.App.csproj b/src/LubanHub.App/LubanHub.App.csproj index 84ac220..db80f74 100644 --- a/src/LubanHub.App/LubanHub.App.csproj +++ b/src/LubanHub.App/LubanHub.App.csproj @@ -5,7 +5,7 @@ enable true app.manifest - true + false LubanHub.App LubanHub.App @@ -15,10 +15,17 @@ + + + None All + + + + diff --git a/src/LubanHub.App/MainWindow.axaml b/src/LubanHub.App/MainWindow.axaml index e3a20f5..99bf9cb 100644 --- a/src/LubanHub.App/MainWindow.axaml +++ b/src/LubanHub.App/MainWindow.axaml @@ -2,16 +2,18 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:views="clr-namespace:LubanHub.App.Views" mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800" x:Class="LubanHub.App.MainWindow" Title="LubanHub" MinWidth="1000" MinHeight="600"> - - - - - + + + + + + + Padding="{DynamicResource ButtonPadding}" + Click="OnBrowseDownloadDirectoryClick"/> +