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, как правило, не владеет всеми свойства, которые есть у модели, и если вы выполняете автоматическое моделирование объекта, многие свойства будут пустыми. Наконец, вам нужно всегда делать некоторые ручные отображения.

Идеи для этой ситуации могут приветствоваться. Спасибо

Другие вопросы по тегам