You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
AuroraDesk 架构分析与优化方案
📋 问题分析
1. AuroraDesk.Application 项目完全没有作用
当前状态:
- ✅ 创建了
AuroraDesk.Application项目 - ✅ 创建了
DTOs/NavigationConfig.cs - ❌ 没有任何 UseCase 或 ApplicationService
- ❌ 没有任何地方引用这个项目
- ❌ NavigationConfig 从未被使用
问题根源:
- 项目是按整洁架构创建的,但没有实际的业务用例需要处理
- 所有业务逻辑都在 ViewModels 和 Infrastructure Services 中
- Application 层变成了一个"空壳"
2. 文件位置不合理
当前文件分布:
AuroraDesk.Core/
└── Interfaces/
├── INavigationService.cs ✅ 接口定义
├── IPageViewModelFactory.cs ✅ 接口定义
└── ...
AuroraDesk.Application/
└── DTOs/
└── NavigationConfig.cs ❌ 未使用
AuroraDesk.Infrastructure/
└── Services/
├── NavigationService.cs ✅ 接口实现
├── TabManagementService.cs ✅ 接口实现
└── ...
AuroraDesk.Presentation/
└── Services/
└── PageViewModelFactory.cs ⚠️ 应该在 Infrastructure?
└── LanguageManager.cs ⚠️ 位置合理?
└── ViewModels/
└── Pages/
├── DashboardPageViewModel.cs
└── ...
主要问题:
-
✅ 这是正确的!PageViewModelFactory放在 Presentation 层- ✅ 它在实现
IPageViewModelFactory接口 - ✅ 它必须依赖 ViewModel 具体类型(DashboardPageViewModel 等)
- ✅ 这些类型在 Presentation 层,所以工厂必须在 Presentation
- ✅ 与 ViewModels 同层,没有跨层依赖问题
- ✅ 它在实现
-
LanguageManager的位置 ✅ 合理- 它是 UI 资源管理
- 在 Presentation 层是合理的
-
NavigationConfigDTO ❌ 未被使用- 没有被使用
- 如果要用,应该用来配置导航菜单
- 但实际配置都在
NavigationService中硬编码
🎯 解决方案
方案A:删除 AuroraDesk.Application 层(推荐)
适用场景:当前业务逻辑简单,没有复杂的业务用例
优点:
- ✅ 简化项目结构
- ✅ 减少不必要的层次
- ✅ 符合 YAGNI 原则(You Aren't Gonna Need It)
- ✅ 清晰的依赖关系
修改内容:
- 删除
AuroraDesk.Application项目 - 将
NavigationConfig.cs移到Core/DTOs/或删除 - 更新
Presentation.csproj移除对Application的引用 - 更新
AuroraDesk.sln移除项目引用
架构图:
┌─────────────────────────────┐
│ AuroraDesk (主项目) │
│ - App.axaml.cs │
│ - 组合所有层 │
└─────────────────────────────┘
↓ 依赖
┌─────────────────────────────┐
│ Presentation │
│ - ViewModels │
│ - Views │
│ - Services/PageViewModel │
│ Factory (工厂) │
└─────────────────────────────┘
↓ 依赖 ↓ 依赖
┌─────────────────────────────┐ ┌──────────────────────────┐
│ Infrastructure │ │ Core │
│ - Services 实现 │←─│ - Entities │
│ - NavigationService │ │ - Interfaces │
│ - TabManagementService │ │ - DTOs │
└─────────────────────────────┘ └──────────────────────────┘
方案B:正确使用 Application 层(适合复杂业务)
适用场景:有复杂的业务逻辑需要处理
实现内容:
- 创建 UseCase 类:
// AuroraDesk.Application/UseCases/NavigationUseCase.cs
public class NavigationUseCase
{
private readonly INavigationService _navigationService;
public NavigationUseCase(INavigationService navigationService)
{
_navigationService = navigationService;
}
public ObservableCollection<NavigationItem> GetNavigationItems(IScreen screen)
{
// 业务逻辑:可能涉及权限检查、动态配置等
return _navigationService.GetNavigationItems(screen);
}
}
-
创建 ApplicationServices:
NavigationApplicationService- 导航业务逻辑TabApplicationService- 标签页业务逻辑
-
使用 DTOs:
- 用
NavigationConfig配置导航菜单 - 从配置文件或数据库加载
- 用
优点:
- ✅ 符合整洁架构标准
- ✅ 适合复杂业务场景
- ✅ 更好的关注点分离
缺点:
- ❌ 当前项目不需要
- ❌ 增加复杂性
- ❌ 违反 YAGNI 原则
方案C:调整文件位置
不删除 Application 层,但调整文件位置:
- 将
PageViewModelFactory移到 Infrastructure:- ✅ 因为它是接口实现
- ❌ 但它依赖 Presentation 的 ViewModel 类型
- 问题:Infrastructure 不能依赖 Presentation
此方案不可行! 因为违反依赖倒置原则。
正确的做法:
PageViewModelFactory依赖 ViewModel 类型- ViewModel 类型在 Presentation 层
- 所以工厂必须在能够访问 Presentation 的地方
- 主项目(AuroraDesk)是唯一选择
方案D:将工厂移到主项目
架构调整:
AuroraDesk (主项目)
├── App.axaml.cs
├── Services/
│ └── PageViewModelFactory.cs ← 放在这里
└── Extensions/
└── ServiceCollectionExtensions.cs
Presentation
└── ViewModels/
└── Pages/
Infrastructure
└── Services/
└── NavigationService.cs ← 使用 PageViewModelFactory
优点:
- ✅ 主项目可以访问所有层
- ✅ 符合依赖注入原则
- ✅ Infrastructure 不依赖 Presentation
缺点:
- ⚠️ 主项目需要引用 Presentation
- ⚠️ 主项目变得更复杂
实际检查:
# 当前主项目引用
AuroraDesk.csproj:
- 引用 Presentation ✅
- 引用 Infrastructure ✅
- 不引用 Core ❌
- 不引用 Application ❌
🎨 推荐方案
推荐:方案A + 方案D 的组合
即:
-
删除
AuroraDesk.Application项目- 因为它完全没有作用
- 业务逻辑都在 Infrastructure 和 Presentation
-
保持
PageViewModelFactory在 Presentation- 因为它是 UI 层的工厂
- 依赖 ViewModel 类型
-
主项目引用
Core和Infrastructure- 不直接引用
- 通过
Presentation间接引用
-
更新主项目引用:
<ProjectReference Include="..\AuroraDesk.Presentation\AuroraDesk.Presentation.csproj" />
<ProjectReference Include="..\AuroraDesk.Infrastructure\AuroraDesk.Infrastructure.csproj" />
<ProjectReference Include="..\AuroraDesk.Core\AuroraDesk.Core.csproj" />
📊 最终架构
┌─────────────────────────────────────────┐
│ AuroraDesk (主项目) │
│ - App.axaml.cs │
│ - 依赖注入配置 │
│ - 组合所有层 │
└─────────────────────────────────────────┘
↓ 依赖
┌─────────────────────────────────────────┐
│ AuroraDesk.Presentation (表示层) │
│ - ViewModels/Pages/ │
│ - Views/ │
│ - Services/ │
│ ├── PageViewModelFactory.cs │
│ └── LanguageManager.cs │
│ - Converters/ │
└─────────────────────────────────────────┘
↓ 依赖 ↓ 依赖
┌─────────────────────────┐ ┌──────────────────────────┐
│ Infrastructure │ │ Core │
│ - Services/ │←─│ - Entities/ │
│ ├── NavigationService│ │ ├── NavigationItem │
│ ├── TabManagement │ │ └── TabItem │
│ └── ... │ │ - Interfaces/ │
│ - Configuration/ │ │ ├── INavigationService│
│ - Extensions/ │ │ └── ... │
└─────────────────────────┘ └──────────────────────────┘
🔍 为什么 Application 层没有作用?
根本原因:
- 当前项目是典型的 CRUD 应用
- 没有复杂的业务逻辑
- 所有操作都是:
- 导航到页面
- 展示数据
- 标签页管理
- 这些都在 Infrastructure 和 Presentation 层完成
什么时候需要 Application 层:
- 复杂的业务规则(如计算逻辑、验证逻辑)
- 跨多个实体的操作
- 工作流管理
- 领域事件处理
- 复杂的权限检查
当前项目:
- 导航:Infrastructure.NavigationService ✅
- 标签页:Infrastructure.TabManagementService ✅
- 状态管理:Infrastructure.NavigationStateService ✅
- UI 管理:Presentation 层 ✅
不需要额外的 Application 层!
✅ 行动建议
推荐执行:
- ✅ 删除
AuroraDesk.Application项目(完全无用) - ✅ 删除未使用的
NavigationConfig.csDTO - ✅ 更新
Presentation.csproj移除 Application 引用 - ✅ 更新
AuroraDesk.sln移除项目引用 - ✅
保持(位置本来就是正确的)PageViewModelFactory在 Presentation - ✅
检查并优化文件组织(文件组织已经很合理)
可选优化:
- 📁 考虑在
Core创建DTOs文件夹(如果需要) - 📁 考虑在
Infrastructure创建Factories文件夹(如果需要)
📝 总结
当前问题分析:
- ❌
AuroraDesk.Application项目完全无用(只有一个未使用的 DTO) - ✅ 文件位置总体完全合理
PageViewModelFactory在 Presentation ✅NavigationService在 Infrastructure ✅ViewModels在 Presentation ✅- 所有文件位置都符合整洁架构
- ⚠️
NavigationConfigDTO 未使用,应该删除
解决方案:
- ✅ 删除
AuroraDesk.Application项目 - ✅ 保持现有文件位置(不需要改动)
- ✅ 清理项目引用
架构原则:
- ✅ YAGNI(You Aren't Gonna Need It)
- ✅ KISS(Keep It Simple, Stupid)
- ✅ 整洁架构(适合项目规模)