Как настроить атрибуты AutoMapper в ASP.NET MVC

#c# #automapper

#c# #automapper

Вопрос:

Согласно документации на GitHub, использовать AutoMapper.Для настройки атрибутов необходимо выполнить три шага следующим образом:

  1. Создайте классы, которые вы хотели бы сопоставить.

  2. Добавьте атрибут [MapsTo] в исходный класс с типом назначения в качестве аргумента. (В качестве альтернативы, вы можете использовать атрибут [MapsFrom] для сопоставления класса назначения с типом источника.)

  3. Вызовите метод расширения mapTypes() в сборке, из которой вы хотите сопоставить свои типы.

Я выполнил шаги 1 и 2, но не могу понять, как и где использовать шаг 3:

Вот мои классы моделей:

 [MapsFrom(typeof(ApplicationRole))]
public class RoleViewModel
{
    public int Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "Role Name")]
    public string Name { get; set; }
    public string Description { get; set; }
}

[MapsTo(typeof(RoleViewModel))]
public class ApplicationRole : IdentityRole<int, ApplicationUserRole>, IRole<int>
{
    public string Description  { get; set; }
}
  

И вот мой метод контроллера:

 public ActionResult Index()
{
    List<ApplicationRole> applicationRoles = RoleManager.Roles.ToList();
    List<RoleViewModel> roleList = Mapper.Map<List<RoleViewModel>>(applicationRoles);  
    return View(roleList);
}
  

Кто-нибудь подскажет мне, как и где вызвать метод расширения mapTypes() в сборке, из которой я хочу сопоставить свои типы, как предложено на третьем шаге AutoMapper.Документация по атрибутам.

Ответ №1:

Я бы сделал в контроллере (в конечном итоге в конструкторе):

  typeof(RoleViewModel).Assembly.MapTypes();
  

Проблема может быть решена, если вы установите версию Automapper 4, потому что в последней версии атрибуты не работают. Поэтому, пожалуйста, добавьте следующие инструкции в консоль Package-Manager:

 uninstall-package Automapper

install-package Automapper -version 4.2.1
  

Комментарии:

1. Я поступил следующим образом: public RoleController() { typeof(RoleController). Сборка. mapTypes(); } Но не сработало!! Выдает исключение с указанием «Последовательность не содержит соответствующего элемента». Не могли бы вы написать подробный код реализации, пожалуйста!!

2. @TanvirArjel пожалуйста, попробуйте и с вашим RoleViewModel тоже. Эта ошибка означает, что вы не сопоставляете какие-либо типы из контроллера, поэтому вам следует использовать его для сборки, в которой вы сопоставляете типы. Извините, я просто предположил, что ваши типы находятся в одной сборке.

3. Пробовал!! Решения пока нет!! То же самое исключение!! Более того, мои типы RoleViewModel и ApplicationRole находятся в разных сборках.

4. @TanvirArjel вы использовали тот, у RoleViewModel которого есть MapsFrom атрибут?

5. @TanvirArjel что вы подразумеваете под сборками? Если оба ApplicationRole и RoleViewModel находятся в разных сборках, как они могут видеть друг друга?