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

.NET Core中按OmniClean架构重构AutoMapper并解决CS1061错误求助

错误修复与整洁架构下的AutoMapper重构方案

错误直接原因

你调用MapperConfig.InitializeAutoMapper()返回的是MapperConfiguration对象,它本身没有Map方法——必须通过它创建IMapper实例才能执行映射。但核心问题是你的写法违背了整洁架构的依赖反转原则,下面是完整的重构实现:


第一步:修正基础代码的语法与命名规范

先修复Subject和SubjectDto的语法错误(属性命名遵循C#帕斯卡规范,修正registerAt?的语法问题):

// 领域层Subject模型(整洁架构中领域层不依赖任何外部框架)
public class Subject
{
    public int? SubjectId { get; set; }
    public string? Title { get; set; }
    public int? Credits { get; set; }
    public string? RegisterAt { get; set; } // 修正语法与命名
}

// 应用层SubjectDto(用于数据传输,属于接口/应用层)
public class SubjectDto
{
    public string? Title { get; set; }
    public int? Credits { get; set; }
    public string? RegisterAt { get; set; } // 同步命名规范
}

第二步:按整洁架构重构映射配置

整洁架构要求外部依赖(如AutoMapper)放在基础设施层,且通过Profile类集中配置,避免上层代码直接依赖框架细节:

// 基础设施层的AutoMapper配置类,继承Profile
public class SubjectMappingProfile : Profile
{
    public SubjectMappingProfile()
    {
        // 属性名完全一致时,AutoMapper会自动映射,无需手动指定ForMember
        CreateMap<Subject, SubjectDto>();
        // 若后续有特殊映射需求(如字段重命名),再添加ForMember配置
    }
}

第三步:注册AutoMapper依赖(依赖注入)

在启动类(Program.cs/Startup.cs)中注册AutoMapper,让框架自动扫描映射配置并注入IMapper实例:

// .NET 6+ Program.cs
builder.Services.AddAutoMapper(typeof(SubjectMappingProfile));
// 或扫描整个基础设施层的所有Profile:
// builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

第四步:控制器中通过依赖注入使用IMapper

控制器属于接口层,仅依赖抽象(IMapper)而非具体实现,完全符合整洁架构的依赖反转要求:

public class SubjectsController : ControllerBase
{
    private readonly ISubjectRepository _subjectRepository; // 依赖仓储抽象(整洁架构推荐)
    private readonly IMapper _mapper;

    // 构造函数注入所有依赖
    public SubjectsController(ISubjectRepository subjectRepository, IMapper mapper)
    {
        _subjectRepository = subjectRepository;
        _mapper = mapper;
    }

    public async Task<IEnumerable<SubjectDto>> GetAllAsync(int id, CancellationToken cancellationToken = default)
    {
        var subjects = await _subjectRepository.GetSubjectsAsync(id, cancellationToken);
        
        if (subjects is null)
        {
            throw new SubjectNotFoundException(id);
        }

        // 直接使用注入的IMapper执行集合映射
        var subjectDtos = _mapper.Map<IEnumerable<SubjectDto>>(subjects);
        return subjectDtos;
    }
}

关键重构要点

  1. 依赖反转:上层代码(控制器)仅依赖IMapper抽象,具体实现由基础设施层提供,符合整洁架构的分层原则
  2. 职责单一:映射配置集中在基础设施层,领域层和应用层完全独立于AutoMapper框架
  3. 代码简化:属性名一致时无需手动编写ForMember配置,减少冗余代码
  4. 避免硬编码:通过依赖注入获取IMapper,而非在控制器中手动初始化配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:33