启动时未加载自动映像配置文件?

时间:2017-09-19 21:55:54

标签: c# automapper asp.net-core-2.0

我正在使用:

  • AutoMapper 6.1.1
  • AutoMapper.Extensions.Microsoft.DependencyInjection 3.0.1

似乎我的个人资料没有被加载,每次我调用mapper.map我得到 AutoMapper.AutoMapperMappingException:&#39;缺少类型地图配置或不支持的映射。&#39; < / p>

这是我的Startup.cs类ConfigureServices方法

 // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        //register automapper

        services.AddAutoMapper();
        .
        .
    }

在另一个名为xxxMappings的项目中,我有我的映射配置文件。 示例类

public class StatusMappingProfile : Profile
{
    public StatusMappingProfile()
    {
        CreateMap<Status, StatusDTO>()
         .ForMember(t => t.Id, s => s.MapFrom(d => d.Id))
         .ForMember(t => t.Title, s => s.MapFrom(d => d.Name))
         .ForMember(t => t.Color, s => s.MapFrom(d => d.Color));

    }

    public override string ProfileName
    {
        get { return this.GetType().Name; }
    }
}

以这种方式在服务类中调用地图

    public StatusDTO GetById(int statusId)
    {
        var status = statusRepository.GetById(statusId);
        return mapper.Map<Status, StatusDTO>(status); //map exception here
    }
调用statusRepository.GetById

后,

status具有值

对于我的Profile类,如果不是从Profile继承而是从MapperConfigurationExpression继承,我得到了一个单元测试,如下所示,表示映射是好的。

    [Fact]
    public void TestStatusMapping()
    {
        var mappingProfile = new StatusMappingProfile();

        var config = new MapperConfiguration(mappingProfile);
        var mapper = new AutoMapper.Mapper(config);

        (mapper as IMapper).ConfigurationProvider.AssertConfigurationIsValid();
    }

我的猜测是我的映射没有被初始化。 我该怎么检查?我错过了什么吗? 我看到了AddAutoMapper()方法的重载

services.AddAutoMapper(params Assembly[] assemblies)

我应该在xxxMappings项目中传递所有程序集。我怎么能这样做?

3 个答案:

答案 0 :(得分:8)

我明白了。由于我的映射是在一个不同的项目中,我做了两件事

  1. 从我的API项目(Startup.cs所在的位置,添加了对我的xxxMapprings项目的引用)
  2. 在ConfigureServices中的
  3. 我使用了获取程序集的重载AddAutoMapper:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    
        //register automapper
        services.AddAutoMapper(Assembly.GetAssembly(typeof(StatusMappingProfile))); //If you have other mapping profiles defined, that profiles will be loaded too.
    

答案 1 :(得分:1)

当我们在解决方案中的不同项目中有映射配置文件时,解决此问题的另一种解决方案是:

services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

答案 2 :(得分:0)

1。创建AutoMapperProfile继承配置文件类


public class AutoMapperProfile : Profile
{
   public AutoMapperProfile() 
    {
        ConfigureMappings();
    }
    private void ConfigureMappings()
    {
       //  DriverModel and Driver mapping classes
       CreateMap<DriverModel, Driver>().ReverseMap();
    } 
}


2。在配置服务中注册此配置文件

public void ConfigureServices(IServiceCollection services)
{
    services.AddAutoMapper(typeof(AutoMapperProfile));
}