Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.013 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал