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

Mapster疑问:Adapt<T>()是否使用IRegister映射,还是必须用IMapper?

关于Mapster中Adapt()与IMapper.Map()的映射规则生效问题

我正在从AutoMapper迁移至Mapster,遇到了一处令人困惑的行为。在我的服务中,以下两种实现返回结果似乎一致:

第一种实现(直接使用Adapt()):

public TestRepository(
    Context context,
    ILogger<AffectationRepository> logger)
{
    _context = context;
    _logger = logger;
}

public async Task<ResultDTO> GetAsync(int id)
{
    Result? res = await _context.Result
        .FirstOrDefaultAsync();

    return res.Adapt<ResultDTO>();
}

第二种实现(使用注入的IMapper):

public TestRepository(
    Context context,
    IMapper mapper,
    ILogger<AffectationRepository> logger)
{
    _context = context;
    _mapper = mapper;
    _logger = logger;
}

public async Task<ResultDTO> GetAsync(int id)
{
    Result? res = await _context.Result
        .FirstOrDefaultAsync();

    return _mapper.Map<ResultDTO>(res);
}

我的问题是:若我通过自定义IRegister定义了映射规则,是否必须使用IMapper才能让这些规则生效?还是调用Adapt<T>()时也会应用已注册的IRegister中的映射?换句话说,Adapt<T>()是否会自动使用Mapster的全局配置(包括自定义注册项),还是该行为仅局限于IMapper?


回答

  • Adapt<T>()扩展方法默认会使用Mapster的全局配置,包括你通过IRegister注册的所有自定义映射规则,不需要依赖注入IMapper实例也能生效。
  • Mapster的全局配置由TypeAdapterConfig.GlobalSettings统一维护,所有基于这个全局配置的映射操作(不管是直接调用Adapt<T>(),还是通过注入的IMapper执行Map<T>())都会共享这些规则。
  • 只有当你创建了独立的配置实例(而非使用全局配置)时,才需要基于该实例创建IMapper来使用对应的规则——此时直接调用Adapt<T>()依然会沿用全局配置的规则。
  • 两种写法的核心差异在于依赖注入的可控性:使用IMapper更符合依赖注入原则,方便在测试场景中替换映射实现;直接用Adapt<T>()写法更简洁,但会耦合全局配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:17:26