MVC: Репозиторий и Viewmodels обе модели вместе для лучшей структуры?
Если я хочу объединить использование репозиториев для каждой сущности и Viewmodels для представления, как это работает?
Любые советы на сайте, которые я мог бы посмотреть? Маби, кто-нибудь может привести простой пример?
Спасибо
С уважением!
3 ответа
Мне нравится следующая структура (из знаменитой серии Pro ASP.NET MVC Стивена Сандерсона):
Доменный проект (Business Logic):
- Абстрактная папка (интерфейсы репозитория)
- Конкретная Папка (реализации репозитория)
- Сущности (EF генерируемые классы)
Проект веб-интерфейса (MVC Web App):
- Модели (просмотр моделей)
- Просмотры
- Controlers
- и т.д., вы получите точку
Главное, вы отделяете свою бизнес-логику (которая должна содержать ваши репозитории) от вашего веб-интерфейса (проект MVC)
В этом сценарии ваши классы контроллеров ссылаются на уровень домена и используют DI/IoC для вызова правильного экземпляра хранилища.
Пример класса контроллера:
namespace MyMvcProject
{
using System.Whatever;
using MyDomainLayer;
public class MyController : Controller
{
private readonly IMyRepository _myRepository;
public MyController(IMyRepository myRepository)
{
// Resolved using your favorite DI/IoC Container:
this._myRepository = myRepository;
}
public ActionResult DoSomething()
{
var stuff = _myRepository.GetStuff();
return View(stuff);
}
}
}
Используйте AutoMapper для копирования данных из сущностей в модели и наоборот. Это сократит количество "сантехнического" кода, который вам придется написать иначе.
Я не профессиональный разработчик, но я думаю, что модель Стива Сандерсона не является подходящей моделью для некоторых проектов, потому что вы работаете в своих взглядах на модель напрямую. Что произойдет, если вы хотите показать только несколько свойств, а не все? Ваша полная модель путешествует в представлении.
Я думаю, что ваши представления должны работать против классов viewmodel, а не напрямую от модели, исходящей из orm (через репозиторий и т. Д.)
Единственная проблема, которую я обнаружил, - это процесс отображения между моделью для viewmodel и viewmodel для модели. Позволь мне объяснить...
Я пытался сделать это отображение с помощью автомапа, направление между моделью -> viewmodel работает нормально, но в другом направлении (viewmodel to model) я не нахожу способ сделать это автоматически, потому что viewmodel, как правило, не владеет всеми свойства, которые есть у модели, и если вы выполняете автоматическое моделирование объекта, многие свойства будут пустыми. Наконец, вам нужно всегда делать некоторые ручные отображения.
Идеи для этой ситуации могут приветствоваться. Спасибо