MVC - ссылка на модель из другой модели - PullRequest
7 голосов
/ 22 ноября 2010

У меня есть такой сценарий в моем приложении:

  • Контроллер1

    • .GetItems ()
  • Model1

    • .GetItems ()
  • Controller2

    • .GetCurrentUser ()
  • Model2

    • .CurrentUser

В этом сценарии Controller1.GetItems () вызывает Model1.GetItems() метод.Метод Model1.GetItems () должен знать (например), какова роль текущего пользователя в создании правильного списка элементов, и он должен получить его из свойства Model2.CurrentUser (в котором хранится кэшированная информация о текущем пользователе).).

Это хорошая практика, чтобы получить доступ к модели из другой модели?

Спасибо, С уважением

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Если на вашу вторую модель часто ссылаются ваши первые, вы можете скомпилировать ваши классы моделей в отдельную библиотеку?

3 голосов
/ 22 ноября 2010

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

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


Дизайн - данные контроллера предоставляются

ModelOne

  • Пользователь GetCurrentUser ()

ModelTwo

  • Items [] GetItems (User)

Фрагмент - данные контроллера предоставляются

Controller {
  function doWork() {
    User user = ModelOne.GetCurrentUser();
    Items[] items = ModelTwo.GetItems(user);
  }
}

Дизайн - модель получает данные

ModelOne

  • Пользователь GetCurrentUser ()

ModelTwo

  • Элементы [] GetItems ()

Фрагмент - модель получает данные

ModelTwo {
  Items[] GetItems() {
    User user = ModelOne.GetCurrentUser();

    ...

  }
}

Controller {
  function doWork() {
    Items[] items = ModelTwo.GetItems();
  }
}
1 голос
/ 22 ноября 2010

Я думаю, у вас не должно быть ссылок между моделями, правильный способ - использовать контроллер для этой ссылки. Так что в вашем случае вы можете передать CurrentUser в качестве параметра в методе GetItems.

...