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
相关产品推荐
相关产品推荐

