Подтвердить что ты не робот

Automapper говорит, что Mapper.Map устарел, глобальные сопоставления?

В моем проекте я определил глобальную конфигурацию Automapper, которая позволила бы мне использовать Mapper.Map<targetType>(sourceObject); в моем коде. (См. Мою конфигурацию ниже.)

Я обновил пакет NuGet, и я вижу сообщение о том, что Mapper.Map устарел/обесценен. Я вернулся в Automapper на GitHub и увидел примеры вроде этого:

[Test]
public void Example()
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Source1, SubDest1>().FixRootDest();
        cfg.CreateMap<Source2, SubDest2>().FixRootDest();
    });

    config.AssertConfigurationIsValid();

    var mapper = config.CreateMapper();

    var subDest1 = mapper.Map<Source1, SubDest1>(new Source1 {SomeValue = "Value1"});
    var subDest2 = mapper.Map<Source2, SubDest2>(new Source2 {SomeOtherValue = "Value2"});

    subDest1.SomeValue.ShouldEqual("Value1");
    subDest2.SomeOtherValue.ShouldEqual("Value2");
}

Мне нужно создать конфигурацию в методе КАЖДЫЙ, который использует сопоставление?

Моя текущая глобальная конфигурация:

namespace PublicationSystem.App_Start
{
    public class AutoMapperConfig
    {
        public static void CreateMaps()
        {
            CreateProjectMaps();
        }

        private static void CreateProjectMaps()
        {
            Mapper.CreateMap<Project, ProjectCreate>();
            Mapper.CreateMap<Project, ProjectSelectable>();
            //...
        }
    }
}

ОБНОВЛЕНИЕ: Благодаря некоторому тренерскому обучению Скотта Чемберлена я создал такой класс:

    public class MkpMapperProfile : AutoMapper.Profile
    {
        protected override void Configure() 
        {
            this.CreateMap<Project, ProjectCreate>();

            this.CreateMap<Project, ProjectSelectable>();

            this.CreateMap<Project, ProjectDetails>();

            // Many Many other maps
        }
    }

Я думаю, что у меня должен быть "MapperConfiguration" в моем классе BaseController. Я начал делать что-то вроде этого:

public partial class BaseController : Controller
{

    private MapperConfiguration mapConfig;

    public BaseController()
    {
        db = new MkpContext();
        SetMapperConfig();
    }

    private void SetMapperConfig()
    {
        mapConfig = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<MkpMapperProfile>();
            });
    }

    public BaseController(MapperConfiguration config)
    {
        db = new MkpContext();
        this.mapConfig = config;
    }
}

Я на правильном пути?

4b9b3361

Ответ 1

Вот как я справился с этим.

Создайте карты в профиле, стараясь использовать метод CreateMap Profile, а не статический метод Mapper с тем же именем:

internal class MappingProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Project, ProjectCreate>();
    }
}

Затем, где бы ни находились зависимостей (например: Global.asax или Startup), создайте MapperConfiguration, а затем используйте его для создания IMapper.

var mapperConfiguration = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile(new MappingProfile());
    });

Затем используйте конфигурацию для создания IMapper:

var mapper = mapperConfiguration.CreateMapper();

Затем зарегистрируйте этот сопоставитель с конструктором зависимостей (здесь я использую Autofac)

builder.RegisterInstance(mapper).As<IMapper>();

Теперь, когда вам нужно отобразить материал, объявите зависимость от IMapper:

internal class ProjectService : IProjectService {
    private readonly IMapper _mapper;
    public ProjectService(IMapper mapper) {
         _mapper = mapper;
    }
    public ProjectCreate Get(string key) {
        var project = GetProjectSomehow(key);
        return _mapper.Map<Project, ProjectCreate>(project);
    }
}

Ответ 2

Это новое в AutoMapper 4.2. Это сообщение в блоге от Jimmy Bogard: Удаление статического API из AutoMapper. Он утверждает, что

Интерфейс IMapper намного легче, и базовый тип теперь просто связан с выполнением карт, устранением многих проблем с потоками...

Новый синтаксис: (вставлен из сообщения в блоге)

var config = new MapperConfiguration(cfg => {
  cfg.CreateMap<User, UserDto>();
});

Если вам просто нужен "старый способ" этого. Последняя версия версии 4.2.1 вернула некоторые традиции. Просто используйте

CreateMap<Project, ProjectCreate>();

вместо

Mapper.CreateMap<Project, ProjectCreate>();

Старый код будет работать нормально.

Ответ 3

Я использую версию 5.2.0, поддержку для создания карт в конструкторах вместо переопределения configure.

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Project, ProjectDto>();
    }
}

В Global.asax.cs вызывается как:

Mapper.Initialize(c=>c.AddProfile<MappingProfile>());

Надеюсь на эту помощь.

Ответ 4

Вы можете найти сконфигурированный AutoMapper 4.2 в моем проекте ASP.NET MVC Template здесь: https://github.com/NikolayIT/ASP.NET-MVC-Template

Ответ 5

Mapper.Initialize(cfg => {
    cfg.CreateMap<Source, Dest>();
});