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

使用程序集扫描时如何访问.NET AutoMapper配置并应用全局忽略规则?

问题解答

能否在程序集扫描注册Profile时获取AutoMapper配置实例?

可以。在依赖注入模式下,你可以通过AddAutoMapper方法的重载参数访问IMapperConfigurationExpression实例完成全局配置;同时也能在自定义Profile类内部直接配置映射规则。

原有IgnoreUnmapped逻辑的DI模式适配方案

针对你实现的忽略未映射属性逻辑,提供两种适配方案:

方案1:基于自定义Profile基类实现全局生效

创建抽象基类Profile,在构造函数中调用IgnoreUnmapped扩展方法,所有业务Profile继承该基类即可自动应用规则:

public abstract class BaseProfile : Profile
{
    protected BaseProfile()
    {
        this.IgnoreUnmapped();
    }
}

// 业务Profile示例
public class UserProfile : BaseProfile
{
    public UserProfile()
    {
        CreateMap<User, UserDto>();
        // 其他映射规则...
    }
}

程序集扫描时,所有继承BaseProfile的类都会自动启用忽略未映射属性的逻辑。

方案2:通过全局配置直接注入逻辑

扩展AutoMapperExtensions,新增针对IMapperConfigurationExpression的扩展方法,在注册AutoMapper时全局生效,无需修改现有Profile:

public static class AutoMapperExtensions
{
    private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr)
    {
        foreach (string propName in map.GetUnmappedPropertyNames())
        {
            if (map.SourceType.GetProperty(propName) != null)
            {
                expr.ForSourceMember(propName, opt => opt.Ignore());
            }
            if (map.DestinationType.GetProperty(propName) != null)
            {
                expr.ForMember(propName, opt => opt.Ignore());
            }
        }
    }

    // 保留原有的Profile扩展方法...

    public static void IgnoreUnmapped(this IMapperConfigurationExpression config)
    {
        config.ForAllMaps(IgnoreUnmappedProperties);
    }

    public static void IgnoreUnmapped(this IMapperConfigurationExpression config, Func<TypeMap, bool> filter)
    {
        config.ForAllMaps((map, expr) =>
        {
            if (filter(map))
            {
                IgnoreUnmappedProperties(map, expr);
            }
        });
    }
}

在DI注册时调用该扩展:

// ASP.NET Core示例
services.AddAutoMapper(config =>
{
    config.IgnoreUnmapped();
    // 可添加过滤规则,比如仅针对特定类型
    // config.IgnoreUnmapped(map => map.SourceType == typeof(User));
}, typeof(Startup).Assembly); // 传入要扫描的程序集

此方式会对所有扫描到的Profile中的映射规则统一应用忽略逻辑,无需修改现有Profile代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:03:26