100 lines
7.0 KiB
Markdown
100 lines
7.0 KiB
Markdown
|
|
# 01. 项目总体设计与依赖
|
|||
|
|
|
|||
|
|
本文档定义了项目的最终分层架构、各项目职责以及每个项目所需的NuGet包依赖清单。
|
|||
|
|
|
|||
|
|
## 1. 项目分层架构
|
|||
|
|
|
|||
|
|
### 1.1. 设计思路与考量
|
|||
|
|
|
|||
|
|
* **分层架构 (Layered Architecture)**:采用经典的洋葱架构(或称整洁架构)思想,将整个系统划分为 `Core` (核心)、`Application` (应用)、`Infrastructure` (基础设施) 和 `WPF` (表现) 四个逻辑层。
|
|||
|
|
* **依赖倒置原则 (Dependency Inversion Principle, DIP)**:高层模块(如 `Application`)不直接依赖低层模块(如 `Infrastructure`)的具体实现,而是依赖于抽象(接口)。这些抽象定义在 `Core` 层。
|
|||
|
|
|
|||
|
|
### 1.2. 设计优势
|
|||
|
|
|
|||
|
|
* **高内聚、低耦合**:每个层级职责单一,内部功能紧密相关(高内聚),层与层之间通过接口而非具体实现进行交互,降低了相互依赖性(低耦合)。
|
|||
|
|
* **可维护性**:当某个技术实现(如数据库从SqlSugar切换到EF Core)发生变化时,只需修改 `Infrastructure` 层,对 `Application` 和 `Core` 层的影响最小。
|
|||
|
|
* **可测试性**:核心业务逻辑(`Core` 和 `Application`)不依赖外部技术,可以独立进行单元测试,无需启动数据库或外部服务,提高了测试效率和覆盖率。
|
|||
|
|
* **可扩展性**:易于引入新的功能模块或替换现有技术栈,例如,增加新的通信协议或更换UI框架。
|
|||
|
|
* **业务逻辑清晰**:核心业务规则集中在 `Core` 层,应用层负责业务流程的编排,使得业务逻辑一目了然。
|
|||
|
|
|
|||
|
|
### 1.3. 设计劣势/权衡
|
|||
|
|
|
|||
|
|
* **初期复杂性**:相比于单体应用或简单的三层架构,分层架构在项目初期需要更多的设计投入和代码组织,增加了学习曲线。
|
|||
|
|
* **层间通信开销**:严格的分层可能导致数据在层间传递时需要进行多次对象转换(如领域模型 -> DTO -> 数据库实体),增加了少量运行时开销和代码量。
|
|||
|
|
* **过度设计风险**:对于非常简单的应用,过度分层可能引入不必要的复杂性,反而降低开发效率。
|
|||
|
|
|
|||
|
|
### 1.4. 各层职责
|
|||
|
|
|
|||
|
|
| 项目名 | 核心职责 | 关键内容 |
|
|||
|
|
| ---------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|||
|
|
| `DMS.Core` | **领域核心**:定义业务规则和数据结构,不依赖任何具体技术实现。是整个系统的稳定内核。 | 领域模型 (`Device`), 业务枚举, 核心接口 (`IRepositoryManager`, `IDeviceRepository`)。 |
|
|||
|
|
| `DMS.Application` | **应用服务**:编排领域模型完成业务用例(Use Case),处理DTO转换。是UI层与核心层的桥梁。 | 应用服务 (`DeviceAppService`), 数据传输对象 (DTOs), AutoMapper配置。 |
|
|||
|
|
| `DMS.Infrastructure` | **基础设施**:提供所有外部技术的具体实现,如数据库访问、协议通信、日志记录等。负责实现核心层的接口。 | 数据库实体, `RepositoryManager`实现, S7/MQTT通信服务, NLog日志Target。 |
|
|||
|
|
| `DMS.WPF` | **表现层**:提供用户界面(UI),采用MVVM模式。负责用户交互、数据显示和请求派发。 | 视图 (Views), 视图模型 (ViewModels), 核心UI服务 (`IChannelBus`, `INavigationService`)。 |
|
|||
|
|
|
|||
|
|
### 1.5. 依赖关系图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TD
|
|||
|
|
DMS.WPF --> DMS.Application
|
|||
|
|
DMS.WPF --> DMS.Infrastructure
|
|||
|
|
DMS.Application --> DMS.Core
|
|||
|
|
DMS.Infrastructure --> DMS.Core
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 2. NuGet包依赖清单
|
|||
|
|
|
|||
|
|
### 2.1. 设计思路与考量
|
|||
|
|
|
|||
|
|
* **按需引入**:每个项目只引入其职责范围内必需的NuGet包,避免不必要的依赖膨胀。
|
|||
|
|
* **版本管理**:建议使用 `Directory.Packages.props` 或 `PackageReference` 统一管理所有项目的NuGet包版本,确保一致性。
|
|||
|
|
* **稳定性优先**:优先选择成熟、稳定且社区活跃的库。
|
|||
|
|
|
|||
|
|
### 2.2. 设计优势
|
|||
|
|
|
|||
|
|
* **项目职责清晰**:通过依赖的NuGet包可以直观地看出该项目的职责和技术栈。
|
|||
|
|
* **减少冲突**:避免不同项目引入相同库的不同版本导致的冲突。
|
|||
|
|
* **优化构建速度**:减少不必要的引用可以略微加快项目构建速度。
|
|||
|
|
|
|||
|
|
### 2.3. 设计劣势/权衡
|
|||
|
|
|
|||
|
|
* **管理开销**:需要手动为每个项目添加引用,并确保版本一致性(尽管有工具可以辅助)。
|
|||
|
|
* **学习成本**:对于不熟悉特定库的开发者,需要额外学习其用法。
|
|||
|
|
|
|||
|
|
### 2.4. 各项目依赖
|
|||
|
|
|
|||
|
|
### `DMS.Core`
|
|||
|
|
* **设计思路**:作为核心业务逻辑层,应保持技术中立和纯净,不依赖任何外部框架或第三方库。
|
|||
|
|
* **优势**:最大化可移植性和可测试性,确保业务规则的稳定性,不受外部技术变化的影响。
|
|||
|
|
* **劣势**:如果某些通用工具类(如简单的辅助函数)被多个层使用,可能需要在 `Core` 层手动实现或复制,而不是直接引用一个通用库。
|
|||
|
|
* **依赖**:无任何第三方依赖。
|
|||
|
|
|
|||
|
|
### `DMS.Application`
|
|||
|
|
* **设计思路**:负责业务流程编排和数据转换,需要对象映射工具。
|
|||
|
|
* **优势**:`AutoMapper` 简化了DTO与领域模型之间的转换,减少了大量重复的映射代码。
|
|||
|
|
* **劣势**:引入了额外的映射配置,对于简单的映射可能显得有些重,且需要一定的学习成本。
|
|||
|
|
* **依赖**:
|
|||
|
|
* `AutoMapper`
|
|||
|
|
* `AutoMapper.Extensions.Microsoft.DependencyInjection`
|
|||
|
|
|
|||
|
|
### `DMS.Infrastructure`
|
|||
|
|
* **设计思路**:作为技术实现层,需要与数据库、PLC、MQTT等外部系统交互,因此需要引入相应的技术栈库。
|
|||
|
|
* **优势**:利用成熟的第三方库(如 `SqlSugar`, `S7netplus`, `MQTTnet`)可以大大加速开发,并利用其经过验证的稳定性、性能和功能。
|
|||
|
|
* **劣势**:对特定库的依赖性强,未来替换成本较高;需要关注库的更新和兼容性问题。
|
|||
|
|
* **依赖**:
|
|||
|
|
* `SqlSugarCore`
|
|||
|
|
* `S7netplus`
|
|||
|
|
* `MQTTnet`
|
|||
|
|
* `MQTTnet.Extensions.ManagedClient`
|
|||
|
|
* `NLog.Extensions.Logging`
|
|||
|
|
|
|||
|
|
### `DMS.WPF`
|
|||
|
|
* **设计思路**:作为表现层,需要UI框架、MVVM支持、依赖注入和日志集成。
|
|||
|
|
* **优势**:`iNKORE.UI.WPF.Modern` 提供现代化的UI组件;`CommunityToolkit.Mvvm` 简化MVVM开发;`Microsoft.Extensions.DependencyInjection` 提供标准的DI容器。
|
|||
|
|
* **劣势**:引入了UI框架和MVVM库的学习成本;UI框架可能存在一定的定制限制。
|
|||
|
|
* **依赖**:
|
|||
|
|
* `Microsoft.Extensions.DependencyInjection`
|
|||
|
|
* `Microsoft.Extensions.Hosting` (用于 `IHostedService`)
|
|||
|
|
* `CommunityToolkit.Mvvm`
|
|||
|
|
* `iNKORE.UI.WPF.Modern`
|
|||
|
|
* `NLog.Extensions.Logging`
|