176 lines
4.5 KiB
Markdown
176 lines
4.5 KiB
Markdown
|
|
# 软件开发文档 - 02. DMS.Application 详细设计
|
|||
|
|
|
|||
|
|
`DMS.Application` 层是业务逻辑的执行者和协调者。它接收来自表现层的请求,使用 `DMS.Core` 的领域模型和接口来完成任务,并向上层返回DTOs。
|
|||
|
|
|
|||
|
|
## 1. 目录结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
DMS.Application/
|
|||
|
|
├── DTOs/
|
|||
|
|
│ ├── DeviceDto.cs
|
|||
|
|
│ ├── MqttServerDto.cs
|
|||
|
|
│ ├── VariableDto.cs
|
|||
|
|
│ └── ... (其他增、删、改、查相关的DTO)
|
|||
|
|
├── Interfaces/
|
|||
|
|
│ ├── IDeviceAppService.cs
|
|||
|
|
│ ├── IMqttAppService.cs
|
|||
|
|
│ └── ... (其他应用服务接口)
|
|||
|
|
├── Services/
|
|||
|
|
│ ├── DeviceAppService.cs
|
|||
|
|
│ ├── MqttAppService.cs
|
|||
|
|
│ └── ... (其他应用服务实现)
|
|||
|
|
├── Profiles/
|
|||
|
|
│ └── MappingProfile.cs
|
|||
|
|
└── DMS.Application.csproj
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 2. 文件详解
|
|||
|
|
|
|||
|
|
### 2.1. 数据传输对象 (`DTOs/`)
|
|||
|
|
|
|||
|
|
DTOs 是为了隔离领域模型和UI而设计的简单数据容器。
|
|||
|
|
|
|||
|
|
#### `DeviceDto.cs`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Application/DTOs/DeviceDto.cs
|
|||
|
|
namespace DMS.Application.DTOs;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 用于在UI上显示设备基本信息的DTO。
|
|||
|
|
/// </summary>
|
|||
|
|
public class DeviceDto
|
|||
|
|
{
|
|||
|
|
public int Id { get; set; }
|
|||
|
|
public string Name { get; set; }
|
|||
|
|
public string Protocol { get; set; }
|
|||
|
|
public string IpAddress { get; set; }
|
|||
|
|
public int Port { get; set; }
|
|||
|
|
public bool IsActive { get; set; }
|
|||
|
|
public string Status { get; set; } // "在线", "离线", "连接中..."
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### `CreateDeviceDto.cs`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Application/DTOs/CreateDeviceDto.cs
|
|||
|
|
using DMS.Core.Enums;
|
|||
|
|
|
|||
|
|
namespace DMS.Application.DTOs;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 用于创建新设备时传输数据的DTO。
|
|||
|
|
/// </summary>
|
|||
|
|
public class CreateDeviceDto
|
|||
|
|
{
|
|||
|
|
public string Name { get; set; }
|
|||
|
|
public ProtocolType Protocol { get; set; }
|
|||
|
|
public string IpAddress { get; set; }
|
|||
|
|
public int Port { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
... (其他DTOs如 `UpdateDeviceDto`, `VariableTableDto`, `MqttServerDto` 等结构类似) ...
|
|||
|
|
|
|||
|
|
### 2.2. 应用服务接口 (`Interfaces/`)
|
|||
|
|
|
|||
|
|
#### `IDeviceAppService.cs`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Application/Interfaces/IDeviceAppService.cs
|
|||
|
|
using DMS.Application.DTOs;
|
|||
|
|
|
|||
|
|
namespace DMS.Application.Interfaces;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 定义设备管理相关的应用服务操作。
|
|||
|
|
/// </summary>
|
|||
|
|
public interface IDeviceAppService
|
|||
|
|
{
|
|||
|
|
Task<DeviceDto> GetDeviceByIdAsync(int id);
|
|||
|
|
Task<List<DeviceDto>> GetAllDevicesAsync();
|
|||
|
|
Task<int> CreateDeviceAsync(CreateDeviceDto deviceDto);
|
|||
|
|
Task UpdateDeviceAsync(UpdateDeviceDto deviceDto);
|
|||
|
|
Task DeleteDeviceAsync(int id);
|
|||
|
|
Task ToggleDeviceActiveStateAsync(int id);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.3. 应用服务实现 (`Services/`)
|
|||
|
|
|
|||
|
|
#### `DeviceAppService.cs`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Application/Services/DeviceAppService.cs
|
|||
|
|
using AutoMapper;
|
|||
|
|
using DMS.Core.Interfaces;
|
|||
|
|
using DMS.Core.Models;
|
|||
|
|
|
|||
|
|
namespace DMS.Application.Services;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 实现设备管理的应用服务。
|
|||
|
|
/// </summary>
|
|||
|
|
public class DeviceAppService : IDeviceAppService
|
|||
|
|
{
|
|||
|
|
private readonly IDeviceRepository _deviceRepository;
|
|||
|
|
private readonly IMapper _mapper;
|
|||
|
|
|
|||
|
|
public DeviceAppService(IDeviceRepository deviceRepository, IMapper mapper)
|
|||
|
|
{
|
|||
|
|
_deviceRepository = deviceRepository;
|
|||
|
|
_mapper = mapper;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<int> CreateDeviceAsync(CreateDeviceDto deviceDto)
|
|||
|
|
{
|
|||
|
|
var device = _mapper.Map<Device>(deviceDto);
|
|||
|
|
device.IsActive = true; // 默认激活
|
|||
|
|
await _deviceRepository.AddAsync(device);
|
|||
|
|
return device.Id; // 返回新创建的ID
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ... 其他方法的完整实现
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.4. AutoMapper配置 (`Profiles/`)
|
|||
|
|
|
|||
|
|
#### `MappingProfile.cs`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Application/Profiles/MappingProfile.cs
|
|||
|
|
using AutoMapper;
|
|||
|
|
using DMS.Core.Models;
|
|||
|
|
using DMS.Application.DTOs;
|
|||
|
|
using DMS.Core.Enums;
|
|||
|
|
|
|||
|
|
namespace DMS.Application.Profiles;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 配置AutoMapper的映射规则。
|
|||
|
|
/// </summary>
|
|||
|
|
public class MappingProfile : Profile
|
|||
|
|
{
|
|||
|
|
public MappingProfile()
|
|||
|
|
{
|
|||
|
|
// Device 映射
|
|||
|
|
CreateMap<CreateDeviceDto, Device>();
|
|||
|
|
CreateMap<UpdateDeviceDto, Device>();
|
|||
|
|
CreateMap<Device, DeviceDto>()
|
|||
|
|
.ForMember(dest => dest.Protocol, opt => opt.MapFrom(src => src.Protocol.ToString()));
|
|||
|
|
|
|||
|
|
// VariableTable 映射
|
|||
|
|
CreateMap<VariableTable, VariableTableDto>();
|
|||
|
|
|
|||
|
|
// Variable 映射
|
|||
|
|
CreateMap<Variable, VariableDto>()
|
|||
|
|
.ForMember(dest => dest.DataType, opt => opt.MapFrom(src => src.DataType.ToString()));
|
|||
|
|
|
|||
|
|
// MqttServer 映射
|
|||
|
|
CreateMap<MqttServer, MqttServerDto>();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|