Какова предпочтительная конфигурация модели для CRUD? - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь выполнить грубые операции на простом веб-сайте управления контентом. При попытке создать мои представления CRUD для ввода фрагмента содержимого необходимо заполнить несколько раскрывающихся списков, а в случае операции редактирования необходимо предварительно выбрать определенные значения. Я читал учебник по нему и изучал как можно больше статей в Интернете, но мне сложно определить, где лучше всего разместить информацию, относящуюся к этим раскрывающимся спискам. Я мог бы легко создать классы моделей для их идентификации, и тогда у меня была бы возможность либо получать данные для их заполнения по одному, либо заполнять эту информацию как свойства в моем классе модели контента, чтобы было выбрано значение этого класса. , но свойство IEnumerable будет доступно для непосредственного связывания.

В любом случае кажется, что с помощью шаблонов можно создавать выпадающие списки, но я пытаюсь устранить некоторые проблемы «Выбрать N + 1» при извлечении этих вещей по отдельности, но я также не хочу упаковывать моя модель полна слишком большого количества мусора, который на самом деле не принадлежит там, как это рассматривается в сравнении с архитектурой MVC.

Таким образом, основной вопрос заключается в следующем: относится ли вспомогательная информация, такая как раскрывающиеся списки, фильтры и т. Д., Как подклассы в первичном классе модели, или они должны извлекаться по отдельности и представляться как отдельные элементы сами по себе? Или есть какой-то другой аспект архитектуры, который следует использовать, и я просто скучаю по лодке?

Статьи, ссылки, перенаправления приветствуются. Я гуглил это, и то, что я нашел, либо не ответило на этот вопрос, либо ответ скрывается в массе результатов.

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

пример: книги и авторы при создании новой книги в представлении необходим элемент управления select, параметры которого заполняются всеми доступными авторами.

Модель Книги должна быть чистой и содержать только соответствующие поля, например Название, Автор

контроллер должен иметь IAuthorRepository _authorRepository; поле, которое могло быть установлено DependencyResolver или вручную в конструкторе контроллеров. IAuthorRepository будет иметь такой метод, как IEnumerable GetAvailableAuthors ();

действие [HttpGet] Create () может вернуть пустую модель Book напрямую, а затем вставить _authorRepository в динамический ViewBag. ViewBag.AuthorRepository = _authorRepository;

Представление затем передаст ViewBag.AuthorRepository частичному представлению или пользовательскому редактору. В этом сценарии ваша модель остается чистой.

Некоторым людям не нравится использование ViewBag.Xxx (или ViewData ["Xxx"]), потому что это не идеальный MVC. Я видел примеры, которые могли бы создать новый тип, такой как BookViewModel. BookViewModel будет тогда содержать Book и IAuthorRepository в себе. Затем действие [HttpGet] Create () вернет объект BookViewModel, и представление отобразит частичное представление Author Select, передав ему модель model.AuthorRepository вместо ViewBag.AuthorRepository. Этот вид начинает больше походить на MVVM, а не на MVC. Ваш инстинкт держать все подобные коллекции или репозитории вне реальной модели (Книги) верен. Чистая модель очень важна и обеспечит вам максимальную гибкость в любой модели.

0 голосов
/ 16 февраля 2011

Я согласен с ответом Тион, но мой ответ не может вписаться в комментарий.

Во-первых, простое решение, если вы используете NHibernate: вы можете настроить пакетирование по коллекциям has-many для загрузки многих объектовв одном запросе (вместо N!).Мы используем пакет размером 100 с очень заметным приростом производительности.Это не поможет, если вы просто загружаете все из одной таблицы.

Теперь самое хитрое, но все же очень стоящее решение.

Если у вас довольно статичный контент, который часто запрашивают (выпадающие списки, поиск имен учетных записей и т. д.) вам следует подумать о кэшировании в памяти.Если вы используете IOC, очень легко поменять местами реализацию CachingRepository для IRepsoitory <>.В моей компании мы позаимствовали FubuCache у FubuMVC, но я думаю, что это просто закулисный словарь.Если у вас есть ферма серверов или несколько серверов, обращающихся к одним и тем же данным, вы можете использовать Memcached для обмена данными.

Важным моментом кэширования является знание того, когда его очищать.(т. е. перезагрузите контент из базы данных.) Для нас это означает

1) каждые 5 минут, независимо от того, что (другие приложения взаимодействуют с БД, поэтому нам нужно забрать их изменения. 2) в любое время, когда сущностьПосле вставки или обновления мы очищаем все соответствующие кэши.

Поскольку большинство наших приложений предоставляют отчеты по большим наборам данных со многими объединениями, мы кэшируем практически все.Пока на вашем сервере достаточно оперативной памяти, все будет в порядке.

ps http://axisofeval.blogspot.com/2010/11/numbers-everybody-should-know.html

0 голосов
/ 15 февраля 2011

Не уверен, что это то, что вам нужно, но я использую свою собственную библиотеку классов с именем Web.Shared, которая содержит все мои вспомогательные методы. У меня есть класс SelectListHelper, который я использую для заполнения всех моих выпадающих списков. Таким образом, мой код отделен от модели основного домена и может быть повторно использован через это и любое другое приложение MVC, которое является частью моего решения.

// Return days of the month for a dropdownlist
public static class SelectListHelper
{
    public static SelectList DayList()
    {
        return NumberList(1, 31);
    }
}

// Use in view 
@Html.DropDownListFor(m => m.Day, SelectListHelper.DayList())

// Another one for selecting genders
public static SelectList GenderList(string selectedValue = null)
{
    IList<KeyValuePair<string, string>> genders = new List<KeyValuePair<string, string>>();
    genders.Insert(0, new KeyValuePair<string, string>("F", "Female"));
    genders.Insert(0, new KeyValuePair<string, string>("M", "Male"));
    genders.Insert(0, new KeyValuePair<string, string>("", "Choose Gender"));
    return new SelectList(genders, "Key", "Value", selectedValue);
}

// Use in my edit view
@Html.DropDownListFor(m => m.Gender, SelectListHelper.GenderList())

В противном случае взгляните на MVC Scaffolding для создания привязанных к данным представлений CRUD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...