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

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
          └── ...

主要问题

  1. PageViewModelFactory 放在 Presentation 层 这是正确的!

    • 它在实现 IPageViewModelFactory 接口
    • 它必须依赖 ViewModel 具体类型(DashboardPageViewModel 等)
    • 这些类型在 Presentation 层,所以工厂必须在 Presentation
    • 与 ViewModels 同层,没有跨层依赖问题
  2. LanguageManager 的位置 合理

    • 它是 UI 资源管理
    • 在 Presentation 层是合理的
  3. NavigationConfig DTO 未被使用

    • 没有被使用
    • 如果要用,应该用来配置导航菜单
    • 但实际配置都在 NavigationService 中硬编码

🎯 解决方案

方案A:删除 AuroraDesk.Application 层(推荐)

适用场景:当前业务逻辑简单,没有复杂的业务用例

优点

  • 简化项目结构
  • 减少不必要的层次
  • 符合 YAGNI 原则(You Aren't Gonna Need It)
  • 清晰的依赖关系

修改内容

  1. 删除 AuroraDesk.Application 项目
  2. NavigationConfig.cs 移到 Core/DTOs/ 或删除
  3. 更新 Presentation.csproj 移除对 Application 的引用
  4. 更新 AuroraDesk.sln 移除项目引用

架构图

┌─────────────────────────────┐
│  AuroraDesk (主项目)        │
│  - App.axaml.cs             │
│  - 组合所有层               │
└─────────────────────────────┘
            ↓ 依赖
┌─────────────────────────────┐
│  Presentation               │
│  - ViewModels               │
│  - Views                    │
│  - Services/PageViewModel   │
│    Factory (工厂)           │
└─────────────────────────────┘
            ↓ 依赖              ↓ 依赖
┌─────────────────────────────┐  ┌──────────────────────────┐
│  Infrastructure             │  │  Core                    │
│  - Services 实现            │←─│  - Entities              │
│  - NavigationService        │  │  - Interfaces            │
│  - TabManagementService     │  │  - DTOs                  │
└─────────────────────────────┘  └──────────────────────────┘

方案B:正确使用 Application 层(适合复杂业务)

适用场景:有复杂的业务逻辑需要处理

实现内容

  1. 创建 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);
    }
}
  1. 创建 ApplicationServices

    • NavigationApplicationService - 导航业务逻辑
    • TabApplicationService - 标签页业务逻辑
  2. 使用 DTOs

    • NavigationConfig 配置导航菜单
    • 从配置文件或数据库加载

优点

  • 符合整洁架构标准
  • 适合复杂业务场景
  • 更好的关注点分离

缺点

  • 当前项目不需要
  • 增加复杂性
  • 违反 YAGNI 原则

方案C:调整文件位置

不删除 Application 层,但调整文件位置

  1. 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 的组合

  1. 删除 AuroraDesk.Application 项目

    • 因为它完全没有作用
    • 业务逻辑都在 Infrastructure 和 Presentation
  2. 保持 PageViewModelFactory 在 Presentation

    • 因为它是 UI 层的工厂
    • 依赖 ViewModel 类型
  3. 主项目引用 CoreInfrastructure

    • 不直接引用
    • 通过 Presentation 间接引用
  4. 更新主项目引用

<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 应用
  • 没有复杂的业务逻辑
  • 所有操作都是:
    1. 导航到页面
    2. 展示数据
    3. 标签页管理
  • 这些都在 Infrastructure 和 Presentation 层完成

什么时候需要 Application 层

  • 复杂的业务规则(如计算逻辑、验证逻辑)
  • 跨多个实体的操作
  • 工作流管理
  • 领域事件处理
  • 复杂的权限检查

当前项目

  • 导航:Infrastructure.NavigationService
  • 标签页:Infrastructure.TabManagementService
  • 状态管理:Infrastructure.NavigationStateService
  • UI 管理:Presentation 层

不需要额外的 Application 层!

行动建议

推荐执行

  1. 删除 AuroraDesk.Application 项目(完全无用)
  2. 删除未使用的 NavigationConfig.cs DTO
  3. 更新 Presentation.csproj 移除 Application 引用
  4. 更新 AuroraDesk.sln 移除项目引用
  5. 保持 PageViewModelFactory 在 Presentation(位置本来就是正确的)
  6. 检查并优化文件组织(文件组织已经很合理)

可选优化

  • 📁 考虑在 Core 创建 DTOs 文件夹(如果需要)
  • 📁 考虑在 Infrastructure 创建 Factories 文件夹(如果需要)

📝 总结

当前问题分析

  1. AuroraDesk.Application 项目完全无用(只有一个未使用的 DTO)
  2. 文件位置总体完全合理
    • PageViewModelFactory 在 Presentation
    • NavigationService 在 Infrastructure
    • ViewModels 在 Presentation
    • 所有文件位置都符合整洁架构
  3. ⚠️ NavigationConfig DTO 未使用,应该删除

解决方案

  • 删除 AuroraDesk.Application 项目
  • 保持现有文件位置(不需要改动)
  • 清理项目引用

架构原则

  • YAGNI(You Aren't Gonna Need It)
  • KISS(Keep It Simple, Stupid)
  • 整洁架构(适合项目规模)