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

.NET Core 2.0中如何为AutoMapper自定义解析器注入依赖

解决ASP.NET Core 2.0中AutoMapper自定义解析器的依赖注入问题

你遇到的问题主要来自两个核心点:自定义解析器的接口实现不符合规范,以及AutoMapper与DI容器的集成配置不到位。咱们一步步来解决:

第一步:修复自定义解析器的接口实现错误

你的ProductIdResolver实现了IValueResolver<Request.Product, Entities.Product, int>,这个接口要求Resolve方法返回int类型(也就是目标属性Id的类型),但你的代码里返回了Entities.Product,这完全不符合接口定义,这是导致映射报错的关键问题之一。先修正这个问题:

public class ProductIdResolver : IValueResolver<Request.Product, Entities.Product, int>
{
    private readonly ICacheService _cacheService;

    // 构造函数注入ICacheService
    public ProductIdResolver(ICacheService cacheService)
    {
        _cacheService = cacheService;
    }

    // 正确返回int类型(目标属性Id的类型)
    public int Resolve(Request.Product source, Entities.Product destination, int destMember, ResolutionContext context)
    {
        if (source == null)
            throw new ArgumentNullException(nameof(source), "请求产品信息不能为空");

        // 从缓存中查找对应Sku的产品
        var productFromCache = _cacheService.GetProducts().FirstOrDefault(p => p.Sku == source.Sku);
        if (productFromCache == null)
            throw new InvalidOperationException("无效的产品SKU:找不到对应的产品信息");

        return productFromCache.Id;
    }
}

第二步:确保依赖服务已注册到DI容器

在Startup.cs的ConfigureServices方法中,首先要确保你的ICacheService实现类已经被注册到DI容器,比如:

// 根据你的实际业务需求选择生命周期(Scoped/Transient/Singleton)
services.AddScoped<ICacheService, YourCacheServiceImpl>();

第三步:注册自定义解析器到DI容器

AutoMapper需要从DI容器中获取自定义解析器的实例,所以要把ProductIdResolver也注册进去:

// 生命周期和缓存服务保持一致即可
services.AddScoped<ProductIdResolver>();

第四步:在AutoMapper Profile中正确配置解析器

在你的SharedProfile中,要针对Entities.Product的Id字段指定使用这个解析器,而不是返回整个实体:

public class SharedProfile : Profile
{
    public SharedProfile()
    {
        CreateMap<Request.Product, Entities.Product>()
            // 为Id字段绑定自定义解析器
            .ForMember(dest => dest.Id, opt => opt.ResolveUsing<ProductIdResolver>());
        
        // 其他公共映射配置...
    }
}

第五步:使用DI注入的IMapper进行映射

不要再用静态的Mapper.Map方法了,静态方法不会走DI容器,自然无法获取到解析器的依赖。在需要映射的类(比如控制器、业务服务)中注入IMapper接口,用实例方法完成映射:

public class ProductService
{
    private readonly IMapper _mapper;

    // 构造函数注入IMapper
    public ProductService(IMapper mapper)
    {
        _mapper = mapper;
    }

    public Entities.Product ConvertToEntity(Request.Product requestProduct)
    {
        // 使用实例的Map方法完成映射
        return _mapper.Map<Entities.Product>(requestProduct);
    }
}

最后验证AutoMapper的基础注册

确保你在Startup.cs中已经正确注册了AutoMapper:

// 扫描包含Startup类的程序集,自动发现所有Profile配置
services.AddAutoMapper(typeof(Startup));

这样配置完成后,AutoMapper在执行映射时会从DI容器中获取ProductIdResolver的实例,而ProductIdResolver的ICacheService依赖也会被DI自动注入,就能解决你遇到的依赖无法解析和映射错误的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:42