Советы по проектированию модели для ASP.NET MVC - PullRequest
2 голосов
/ 25 марта 2009

В настоящее время я занимаюсь преобразованием некоторых небольших личных веб-сайтов из WebForms в MVC. На существующих сайтах схема базы данных является надежной, но я никогда не тратил время на создание правильных данных / бизнес-моделей / слоев. Страницы aspx общались с базой данных напрямую, используя различные представления и хранимые процедуры, которые создавались по мере необходимости для удобства. С MVC я сейчас пытаюсь «сделать все правильно», как говорится, и использовать такие вещи, как LINQ to SQL и / или Entity Framework, для построения правильной модели данных или моделей для приложения.

Мой вопрос вращается вокруг того, какие цели я должен иметь для построения моделей данных. Я прочитал различные статьи, связанные с шаблонами, и я понимаю, что в конечном итоге ответ, вероятно, будет зависеть от характеристик моих данных. Но обычно я должен пытаться создавать более крупные модели, которые охватывают как можно большую часть базы данных, чтобы был только один способ взаимодействия с данным набором таблиц? Или я должен создать меньшие пользовательские модели для каждого MVC View, которые содержат только те данные и доступ, которые необходимы View?

Ответы [ 3 ]

2 голосов
/ 25 марта 2009

Или я должен создать меньшие пользовательские модели для каждого MVC View, которые содержат только те данные и доступ, которые необходимы View?

Это, вероятно, будет лучше.

Не забывайте, что вы можете привязывать свои модели к иерархии, поэтому в каждой модели могут присутствовать общие свойства, такие как идентификаторы, имена, предпочтения.

Полноценные расширенные модели могут быть лучше для корпоративных приложений, где фреймворк автоматически делает много вещей, основываясь на предварительно загруженных пользовательских предпочтениях, пользовательских ролях, правах доступа и т. Д. Для небольшого личного проекта, вероятно, было бы лучше попытаться сохранить ваши модели небольшими и чистый. Это также защита. Не помещая ненужные данные в модель, вы гарантируете, что ваше представление не будет по ошибке отображать неправильные записи или что отправка формы не будет ошибочно перезаписывать некоторые другие данные.

0 голосов
/ 25 марта 2009

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

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

Например:

Ваша модель может включать в себя:

public class Car() 
{
  public string Model;
}

public class Driver()
{
  public string Name;
}

Вы хотите, чтобы вид выводил имя и модель автомобиля, и вам необходимо было бы передать объектам модели Car и Driver вид.

Вместо того, чтобы отправлять два объекта модели непосредственно из контроллера в представление, вы можете создать объект, содержащий только те данные, которые вам нужны:

public class CarAndDriverViewModel()
{
  public string CarMake;
  public string DriverName;
}

Вы должны заполнить этот объект из данных домена и передать его представлению. И мнение будет:

model.DriverName + ": " + model.CarMake

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

Существуют проекты и соглашения, которые можно использовать для автоматизации создания моделей представлений, если вы хотите их изучить. AutoMapper является примером.

0 голосов
/ 25 марта 2009

Я бы выбрал модель, представляющую фактическую логику данных в вашей текущей системе, и попросил бы ваши контроллеры вернуть часть модели, которая нужна представлению, например:

Контроллер:

public ActionResult index()
{
    var ListOfObjects = DataHelper.GetAll();
    ViewData.Add(ListOfObjects);
    return View();
}

public ActionResult ViewObject(int id)
{
    var Object= DataHelper.GetObject();
    ViewData.Add(Object);
    return View();
}

public ActionResult ViewObjectChild(int Objectid, int ChildId)
{
    var Child= DataHelper.GetChildObject(Objectid, ChildId);
    ViewData.Add(Child);
    return View();
}

На виду

/

<%  var myListOfObjects = ViewData.Get<IList<Object>>(); %>

/ ViewObject / 1 /

<%  var myobject= ViewData.Get<Object>(); %>

/ ViewChild / 1/1 /

<%  var myChild = ViewData.Get<Child>(); %>

Примечание. Я использовал функции MVC Contrib, которые я настоятельно рекомендую.

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