Dto 数据传输层

Dto这一层是作为Controller层和Services层的传输数据类存放层。包含Requests和Dtos。

300

Dtos

在Dtos文件夹下,建立对应领域的文件夹,将对应领域的Dto类放在这里面。 Dto应该完全隔离于数据库的类,没有特殊情况,不允许包含IsDeletedCreateTimeUpdateTime等数据库字段。可以理解为业务和服务用的传输数据类。

Dto一般体现为对应领域的具体实体,一般有以下几种

  • XXXDto,这种表现为对应领域的详情Dto
  • XXXListDto,这种表现为对应领域的列表Dto,相比详情字段可能更少,在部分情况下的列表接口可以不建立ListDto直接返回Dto
  • XXXAggregateDto,聚合根Dto,常见与多个业务领域聚合的情况,在聚合根下同时存在其他的Dto引用。就比如客户下同时存在地址的Dto和账户的Dto。

image.png|1024

///患者信息,聚合根(患者)
public record PatientInfoAggregateDto
{
    /// <summary>
    /// 病人    
    /// </summary>
    public long PatientSeq { get; set; }

    /// <summary>
    /// 姓名
    /// </summary>
    public string PersonNameCn { get; set; }

    /// <summary>
    /// 居住地址,聚合信息
    /// </summary>
    public PatientAddressDto LocalAddress { get; set; }

    /// <summary>
    /// 籍贯地址,聚合信息
    /// </summary>
    public PatientAddressDto NativeAddress { get; set; }

    /// <summary>
    /// 户口地址,聚合信息
    /// </summary>
    public PatientAddressDto RegisteredAddress { get; set; }

    /// <summary>
    /// 出生地址
    /// </summary>
    public PatientAddressDto BirthAddress { get; set; }

    /// <summary>
    /// 患者社会关系,聚合信息
    /// </summary>
    public List<PatientRelationshipDto> patientRelationshipsList { get; set; }
...
}

Requests

在Requests文件夹下,建立对应领域的文件夹,将对应领域的Dto类放在这里面。

与Dtos不同,Requests只需要关注具体方法即可,具体命名为XXXRequest,即方法名+Request。

  1. 注意Requestrecord
  2. 使用init而不是set,防止前端数据被篡改
  3. 在记录下方建立对应的参数验证器,命名为XXXRequestValidator,具体参数验证方式参考FluentValidation验证器
  4. 入参应该是完全隔离于数据库的类,没有特殊情况,不允许传入像是IsDeletedCreateTimeUpdateTime等数据库字段。可以理解为业务用的请求类。
public record CreateAccessPartyRequest
{
    /// <summary>
    /// 应用名称
    /// </summary>
    public string AppName { get; init; }

    /// <summary>
    /// 应用地址
    /// </summary>
    public string AppUrl { get; init; }

    /// <summary>
    /// 应用IP地址
    /// </summary>
    public string IPAddress { get; init; }

    /// <summary>
    /// 应用描述
    /// </summary>
    public string Description { get; init; }

    /// <summary>
    /// 是否启用
    /// </summary>
    public bool IsEnabled { get; init; }
}

public class CreateAccessPartyRequestValidator : AbstractValidator<CreateAccessPartyRequest>
{
    public CreateAccessPartyDtoValidator()
    {
        RuleFor(x => x.AppName).NotEmpty().WithMessage("应用名称为必填项。");
    }
}

results matching ""

    No results matching ""