• .NET Core 中依赖注入 AutoMapper 小记


    最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式

    services.AddSingleton<IMapper>(new Mapper(new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, MentionUserDto>();
    })));

    于是趁机学习了解一下,在 github 上发现了 AutoMapper.Extensions.Microsoft.DependencyInjection ,使用它只需通过 AutoMapper.Profile 配置映射

    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<User, MentionUserDto>();
        }
    }

    然后通过 AddAutoMapper() 进行依赖注入,它会在当前程序集自动找出所有继承自 Profile 的子类添加到配置中

    services.AddAutoMapper();

    后来发现在使用 ProjectTo 时

    .Take(10)
    .ProjectTo<MentionUserDto>()
    .ToListAsync(); 

    发现如果自己使用 AddSingleton<IMapper>() ,会出现下面的错误(详见博问):

    Mapper not initialized. Call Initialize with appropriate configuration.

    使用 AddAutoMapper() 并且将 UseStaticRegistration 为 false 时也会出现同样的问题。

    解决方法是给 ProjectTo 传参 _mapper.ConfigurationProvider (注:传 _mapper 不行)

    .ProjectTo<MentionUserDto>(_mapper.ConfigurationProvider)

    对于自己依赖注入的操作方式,后来参考  AutoMapper.Extensions.Microsoft.DependencyInjection 的实现

    services.AddSingleton(config);
    return services.AddScoped<IMapper>(sp => new Mapper(sp.GetRequiredService<IConfigurationProvider>(), sp.GetService));

    采用了下面的方式,如果不想使用 AddAutoMapper()  通过反射自动找出 Profile ,建议使用这种方式

    AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile<MappingProfile>();
    });
    services.AddSingleton(config);
    services.AddScoped<IMapper, Mapper>();
  • 相关阅读:
    pytest之fixture的详细使用
    pytest之自定义标记mark
    解决pytest.mark自定义标签导致的warning
    pytest之参数化parametrize的使用
    Jenkins上allure报告清空上一次运行记录
    Jenkins配置从节点并生成allure测试报告
    《编程珠玑》笔记:数组循环左移
    精确覆盖 DLX
    海量数据的插入和查找 bloom filter
    ORACLE数据库的一些限制
  • 原文地址:https://www.cnblogs.com/dudu/p/8279114.html
Copyright © 2020-2023  润新知