#c# #automapper
#c# #automapper
Вопрос:
Согласно документации на GitHub, использовать AutoMapper.Для настройки атрибутов необходимо выполнить три шага следующим образом:
-
Создайте классы, которые вы хотели бы сопоставить.
-
Добавьте атрибут [MapsTo] в исходный класс с типом назначения в качестве аргумента. (В качестве альтернативы, вы можете использовать атрибут [MapsFrom] для сопоставления класса назначения с типом источника.)
- Вызовите метод расширения 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
находятся в разных сборках, как они могут видеть друг друга?