zoukankan      html  css  js  c++  java
  • .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>();
  • 相关阅读:
    Jenkins配置:添加用户和管理权限
    Jenkins安装与配置
    jenkins配置邮件通知
    Jenkins 配置邮件通知
    jenkins+SVN配置
    第九周学习进度
    梦断代码阅读笔记 01
    第八周学习进度
    “理了么”软件特点NABCD个人分析
    第七周学习进度
  • 原文地址:https://www.cnblogs.com/dudu/p/8279114.html
Copyright © 2011-2022 走看看