Профилите на Automapper не се зареждат при стартиране?

Аз използвам:

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

Изглежда профилите ми не се зареждат, всеки път, когато извикам mapper.map, получавам AutoMapper.AutoMapperMappingException: „Липсваща конфигурация на карта на тип или неподдържано картографиране.“

Ето моя метод ConfigureServices от клас Startup.cs

 // 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
    }

status има стойности след извикване на statusRepository.GetById

За моите класове 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. Как мога да направя това?


person mspasiuk    schedule 19.09.2017    source източник


Отговори (3)


Разбрах го. Тъй като моите съпоставяния са в различен проект, направих две неща

  1. От моя API проект (където се намира Startup.cs, добавена препратка към моя проект xxxMapprings)
  2. в ConfigureServices използвах претоварването 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.
    
person mspasiuk    schedule 20.09.2017

Друго решение за коригиране на проблема, когато имаме картографски профили в различни проекти в решение, е:

services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
person Adrita Sharma    schedule 17.04.2021

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));
}
person kuldeep chopra    schedule 06.12.2019
comment
това не проработи за мен, пише Невъзможно разрешаване на услуга за тип „AutoMapper.Mapper“, докато се опитвате да активирате. Профилът не се изпълнява. - person liang; 14.04.2021