在MVVM设计模式中,我应该从ViewModel还是Model调用我的服务?

3

我在SO上问了另一个问题,有一个用户建议我做以下的事情,让我感到非常困惑:我已经在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

我不会将存储库与实体混合在一起,因为我希望实体不受任何上下文或环境状态的限制。我认为管理实体的存储是存储库的唯一责任。

如果实体之间存在依赖关系会发生什么?例如,一个学校拥有学生。在保存学生之前无法保存学校。你必须在学生实体中构建这种逻辑。那么你的学生会同时保存学校吗?他们会拒绝保存吗?他们需要检查学校的数据库吗?他们至少需要了解学校的一些信息,这样你就创建了一个相当硬编码的学校和学生之间的依赖关系。

然后你添加教师,你需要为他们添加类似的逻辑。用于表示这些关系和依赖关系的代码就会分散在许多实体中。考虑事务。再添加多个层次。你可以看到这可能会变得多么复杂。很快你就会有意大利面条加肉丸和奶酪!

知道这些东西是存储库的责任。

希望对你有所帮助。

祝好


0

从实体中调用服务违反了单一职责原则。如果将来需要从与服务不同的后备存储库中填充实体,则必须更改所有实体。即使您注入了存储库,它仍然违反了SRP。


0

我不明白这种方法有什么问题,如果我想从SQL Server切换到Oracle,我只需要注册一个名为“OracleSchoolRepository”的新存储库,并确保它满足ISchoolRepository接口。

我没有看到任何问题?您能举出上述情况会成为问题的场景吗?

谢谢!

Ben


我问你是因为你似乎在使用另一种方法?为什么?你要解决什么问题? - BenjaminPaul
我正在尝试解决这个问题 => http://stackoverflow.com/questions/4288493/wpf-mvvm-re-use-a-viewmodel-in-multiple-controller-and-separation-of-concerns/4292411#4292411 你已经参与了讨论;-) 我会找到一个解决方案,虽然不是今天,但很快。 - Elisabeth
大家好,我对这个问题真的很困惑。我看到很多移动应用程序都使用MVVM架构,并且其中大多数直接从ViewModel进行服务/ repo调用。这样做,他们不是绕过了我的模型中制定的业务规则吗? ViewModel只是向视图显示数据,而业务逻辑应该在模型中进行,因此服务/ repo调用是否应该从模型中进行? - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接