You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 9 Clean Architecture项目中跨层共享DTO的管理最佳实践咨询

Clean Architecture中DTO的最佳实践(.NET 9场景)

1. 按层职责拆分DTO,拒绝跨层复用

每个层的DTO应该只服务于自身的核心职责,独立定义:

  • API层:定义Request/Response DTO,作为对外交互的契约。这类DTO只保留API需要的字段,可添加API专属的验证规则(比如[Required]、[EmailAddress]等数据注解,或FluentValidation规则)。例如:
    // API/Models/Requests/CreateUserRequest.cs
    public class CreateUserRequest
    {
        [Required]
        [MaxLength(50)]
        public string Username { get; set; }
        
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
    
  • Application层:定义Command/Query DTO(或Application DTO),适配业务逻辑的输入输出。这类DTO包含业务操作需要的所有信息,和API契约解耦。例如:
    // Application/Dtos/CreateUserCommand.cs
    public class CreateUserCommand
    {
        public string Username { get; set; }
        public string HashedPassword { get; set; }
        public Guid TenantId { get; set; } // 业务内部需要,API不需要暴露
    }
    
  • Frontend(MVC)层:定义ViewModel,专门用于页面展示或表单提交。可根据UI需求合并、裁剪API返回的数据,甚至添加UI专属字段(比如是否显示编辑按钮的标记)。例如:
    // Frontend/ViewModels/UserViewModel.cs
    public class UserViewModel
    {
        public string Username { get; set; }
        public DateTime CreatedAt { get; set; }
        public bool CanEdit { get; set; } // UI专属逻辑字段
    }
    

2. 用映射工具实现层间数据转换

使用AutoMapper、Mapster等工具处理不同层DTO/ViewModel之间的映射,避免手动硬编码转换逻辑,同时保证层与层的解耦:

  • 在API层,将Request DTO映射为Application层的Command/Query;
  • 在Application层,将Domain实体映射为Application DTO,再由API层映射为Response DTO;
  • 在Frontend层,将API的Response DTO映射为ViewModel。

示例(AutoMapper配置):

// API/MappingProfiles/ApiToApplicationProfile.cs
public class ApiToApplicationProfile : Profile
{
    public ApiToApplicationProfile()
    {
        CreateMap<CreateUserRequest, CreateUserCommand>()
            .ForMember(dest => dest.HashedPassword, opt => opt.Ignore()); // 业务层负责加密
    }
}

3. 明确SharedKernel的边界

SharedKernel只应该存放跨层的通用基础组件,而非业务相关的DTO:

  • 通用值对象(比如EmailAddress、PhoneNumber);
  • 跨层枚举(比如UserRole);
  • 通用异常类、日志工具类;
  • 通用验证规则(比如字符串长度校验的静态方法)。

这些组件是真正的横切关注点,不会随业务逻辑变化频繁修改,不会引发耦合问题。

4. 避免“为复用而复用”的误区

不要为了减少代码重复就强行复用DTO——短期的代码精简会换来长期的维护灾难:

  • API契约变更(比如添加字段)可能会意外影响Application层的业务逻辑;
  • Application层修改DTO字段,可能会破坏API兼容性或Frontend的UI展示;
  • 多层复用同一DTO会导致每个DTO承担过多职责,违背单一职责原则。

总结

核心原则是关注点分离:让每个层的DTO只服务于自身的需求,通过映射工具实现层间数据的解耦转换,SharedKernel只保留真正通用的跨层组件。这种设计既解决了高耦合问题,又保证了各层的独立性和可维护性。

内容的提问来源于stack exchange,提问作者Solo Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:40:17