automapper, при создании действия на контроллере. Запутался

#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. Игнорируйте только свойства с одинаковым именем. Те, которые не совпадают, не вызовут проблемы.