Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Automapping
Прежде чем приступить к использованию этого класса, стоит заметить, что это не совсем удобно. Мы создали совершенно другой класс, но добавлять в БД мы должны класс User, а это означает, что в каком-то месте программы мы должны передавать от объекта UserView в User поля, так и наоборот. А при большом количестве объектов и полей – это рутинно, к тому же, подобное у нас уже есть в функции Update[Table] в репозитории. Для решения этой задачи существуют так называемые мапперы object-to-object. Одним из самых популярных, является automapper (https://automapper.org/). Собственно, эта библиотека берет на себя работу по переводу одного объекта в другой, и, как мы дальше увидим, там еще есть много других вкусных плюшек. Устанавливаем Automapper: Install-Package AutoMapper Так как при разработке программы мы избегаем сильную связность, то организуем интерфейс + реализацию и зарегистрируем это в Ninject, после чего выведем использование в контроллер. Создаем в /Mappers public interface IMapper { object Map(object source, Type sourceType, Type destinationType); } Реализация: public class CommonMapper: IMapper { static CommonMapper() { Mapper.CreateMap< User, UserView> (); Mapper.CreateMap< UserView, User> (); }
public object Map(object source, Type sourceType, Type destinationType) { return Mapper.Map(source, sourceType, destinationType); } } Регистрация (пусть будет как объектодиночка): kernel.Bind< IMapper> ().To< CommonMapper> ().InSingletonScope(); В BaseController: public abstract class BaseController: Controller { [Inject] public IRepository Repository { get; set; }
[Inject] public IMapper ModelMapper { get; set; } } Теперь изменим UserController (и View) с использованием UserView: [HttpGet] public ActionResult Register() { var newUserView = new UserView(); return View(newUserView); }
[HttpPost] public ActionResult Register(UserView userView) { if (userView.Captcha! = " 1234") { ModelState.AddModelError(" Captcha", " Текст с картинки введен неверно"); } var anyUser = Repository.Users.Any(p => string.Compare(p.Email, userView.Email) == 0); if (anyUser) { ModelState.AddModelError(" Email", " Пользователь с таким email уже зарегистрирован"); }
if (ModelState.IsValid) { var user = (User)ModelMapper.Map(userView, typeof(UserView), typeof(User)); //TODO: Сохранить } return View(userView); } И в Register.cshtml изменится первая строка: @model LessonProject.Models.ViewModels.UserView
|