2016-02-12 3 views
21

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

Я обновил пакет 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>(); 
      //... 
     } 
    } 
} 

UPDATE: Благодаря некоторым коучинга Скотта Чемберлен я создал класс, как это:

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

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

+1

Automapper удаляется от статических функций, охватываемых глобальными областями. Это позволяет библиотекам, написанным разными авторами, использовать AutoMapper, не мешая друг другу. –

+1

Я не уверен, что это значит для меня. Я получаю информацию и здесь, но это не дает мне полной картины. Я читал это: https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API, но это не имеет смысла. Нужно ли определять конфигурацию в КАЖДОЙ ActionResult, которая использует AutoMapper? Я мог бы переместить его в datalayer ... И у моего приложения, похоже, нет 'MvcApplication.MapperConfiguration'. Где это определено? –

+0

Вы делаете это, в основном создаете класс, который происходит из 'Profile', переопределяет функцию' Configure() ', а затем вставляет в' CreateProjectMaps', а заменяет 'Mapper.'' this.' –

ответ

35

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

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

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); 
    } 
} 
+3

Обратите внимание, что в AutoMapper 5.0 MappingProfile confi обрабатывается только в конструкторе. Больше не нужно переопределять. –

2

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

  1. Создать эти классы: https://github.com/NikolayIT/ASP.NET-MVC-Template/tree/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web.Infrastructure/Mapping

  2. вид Annotate модели с IMapFrom<>: https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20Core/Web/AspNetCoreTemplate.Web/ViewModels/Settings/SettingViewModel.cs

  3. Использование это как .To<SomeViewModel>(). Пример: https://github.com/NikolayIT/ASP.NET-MVC-Template/blob/master/ASP.NET%20MVC%205/Web/MvcTemplate.Web/Controllers/HomeController.cs#L27

+0

Эти ссылки больше не существуют? –

+0

@AkshayRandive, спасибо, теперь они исправлены. –

7

Это новинка в AutoMapper 4.2. Есть сообщение в блоге от Jimmy Bogard: Removing the static API from AutoMapper.Он утверждает, что

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

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

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

Если вы просто хотите «старый способ» делать это. Последняя версия 4.2.1 привела некоторые традиции. Просто используйте

CreateMap<Project, ProjectCreate>(); 

вместо

Mapper.CreateMap<Project, ProjectCreate>(); 

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

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

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

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

В Global.asax.cs вызове, как:

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

Надеется, что это помощь.

+0

Если вам нужно динамически добавлять профили «Mapper.Initialize (c => c.AddProfiles (новая строка [] {" DLL_NAME "}));' – JenonD

Смежные вопросы