#asp.net-mvc #automapper
#asp.net-mvc #automapper
Вопрос:
У меня все настроено для работы automapper. Атрибут также работает нормально и правильно заполняет DTO. Действие создания моего контроллера выглядит следующим образом
[HttpPost]
[AutoMap(typeof(User), typeof(UserCreateDTO))]
public ActionResult Create(User user)
{
if (ModelState.IsValid)
{
_repository.Create(user);
return RedirectToAction("Details", new { id = user.UserId });
}
return View("Edit", user);
}
У меня есть DataAnnotation, установленный для пользовательского объекта, который является моим объектом Entity и передается
к репозиторию, который является интерфейсом через реализацию и использует пользовательский объект везде.
То, что я хочу сделать, похоже на приведенное ниже, используя тот же приведенный выше код.
[HttpPost]
[AutoMap(typeof(User), typeof(UserCreateDTO))]
public ActionResult Create(UserCreateDTO userdto)
{
if (ModelState.IsValid)
{
_repository.Create(userdto);
return RedirectToAction("Details", new { id = userdto.UserId });
}
return View("Edit", userdto);
}
Вопрос:
Мои обозначения данных теперь находятся в UserCreateDTO, чтобы ограничить то, что я хочу проверить.
Как только проверка пройдена, возникает проблема, которая заключается в том, что я передаю userdto для создания метода, который не позволяет мне
поскольку пользовательский объект находится в интерфейсе, подобном приведенному ниже
public interface IUserRepository
{
IQueryable<User> GetAllUsers();
User GetUserById(Guid id);
void Create(User user);
User Edit(User user);
void Delete(User user);
void Save();
}
Я не могу изменить весь код, чтобы заменить UserCreateDTO в интерфейсе и репозитории, и что, если у меня есть UserEditDTO / UserShowDTO.
Как я решаю эту проблему?. Я объяснил как можно больше.
Ответ №1:
Почему бы вам не выполнить обратное сопоставление с пользовательским объектом перед вызовом Create? Вам не нужно использовать атрибуты. Вы можете вызвать Map напрямую.
Mapper.CreateMap<UserCreateDTO, User>();
var user = new user();
Mapper.Map<UserCreateDTO, User>(userdto, user);
Установите отладчик на остановку после вызова map и проверьте, чтобы убедиться, что значения были скопированы правильно.
Комментарии:
1. Приведите мне, пожалуйста, пример моего приведенного выше метода действий. Буду благодарен. Я новичок в automapper.
2. Вы также можете переместить вызов create map в одно место в приложении, создав свой собственный класс, наследующий AutoMapper. Настройка профиля и переопределения.
3. Есть много способов сделать это. Я показывал ему минимум, необходимый для запуска.
4. В крайнем случае, я уже сделал все, что вы сказали, для Mapper. CreateMap<UserCreateDTO, User>(); Это сопоставление выполняется плавно, поскольку источник обладает всеми свойствами назначения, но опять же отображает Mapper. CreateMap<User, UserCreateDTO>(); как предложил rboarman, это дополнительная работа, поскольку я должен упомянуть IGNORE для свойств, которые не принадлежат DTO пользователю. Должен быть простой подход к моей проблеме?
5. Игнорируйте только свойства с одинаковым именем. Те, которые не совпадают, не вызовут проблемы.