Должен ли я вызывать мои сервисы из модели ViewModel OR в схеме проектирования MVVM? - PullRequest
3 голосов
/ 27 ноября 2010

Я задавал другой вопрос здесь о SO, и один пользователь действительно смутил меня, предложив сделать следующее: я прочитал это 1000 раз на SO, что объект никогда не должен делать вызов сохранения / добавления / удаления через службу длябаза данных.Вот задача ViewModel!

Что вы говорите?

public class School
{
   private ISchoolRepository _repository;

   public string Name { get; set; }

   public School()
   {
      this._repository = IoC.Resolve<ISchoolRepository>();
   }

   public bool IsValid()
   {
     // Some kind of business logic?
     if (this.Name != null)
     {
       return true;
     }

      return false;
   }

   public void Save()
   {
      if (this.isValid())
      {
         this._repository.Save(this)
      }
}

Ответы [ 3 ]

1 голос
/ 28 ноября 2010

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

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

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

Ответственность за эту информацию лежит на хранилищах.

HTH

Приветствия

0 голосов
/ 27 ноября 2010

Я не понимаю, что не так с этим подходом, если бы я хотел поменять местами сервер SQL, скажем, на Oracle, я бы просто зарегистрировал новый репозиторий под названием "OracleSchoolRepository и убедился, что он удовлетворяет интерфейсу ISchoolRepository.

Я не вижу никаких проблем с этим? Можете ли вы выделить сценарий, когда вышеуказанное станет проблемой?

Спасибо!

Ben

0 голосов
/ 27 ноября 2010

Вызов службы из вашей организации нарушает принцип единой ответственности. Если в будущем вам понадобится гидратировать ваши сущности из другого резервного хранилища, а не службы, вам нужно будет изменить все ваши сущности. Даже если вы вводите репозиторий, он все еще нарушает SRP.

...