我是否可以从MVVM设计模式中的ViewModel OR Model调用我的服务?

时间:2010-11-27 16:19:03

标签: wpf mvvm service repository call

我在这里问另一个问题,一个用户真的很困惑我建议做以下事情:我已经在SO上读了1000次,实体不应该通过服务进行保存/添加/删除调用数据库。这是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 个答案:

答案 0 :(得分:1)

我不会将存储库与实体混合,因为我喜欢实体没有任何上下文或环境状态。我认为管理实体的存储是存储库的唯一责任。

如果您在实体之间存在依赖关系会发生什么?例如,一所学校有学生。在拯救学校之前,您无法保存学生。您必须将此逻辑构建到学生实体中。你的学生也会拯救学校吗?他们会拒绝拯救吗?他们需要检查学校的数据库吗?他们至少需要了解一下学校的情况,这样你就可以在学校和学生之间建立一种非常难以接受的依赖。

然后你添加老师,你需要为他们添加类似的逻辑。然后,代表这些关系和依赖关系的代码将分布在许多实体中。考虑交易。然后添加多个层。你看到这会变得多么复杂吗?很快你就会有意大利面配肉丸和奶酪!

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

HTH

干杯

答案 1 :(得分:0)

从您的实体调用服务违反了单一责任原则。如果将来需要让您的实体从与服务不同的后备存储中保持水分,您将需要更改所有实体。即使您正在注入存储库,它仍然违反了SRP。

答案 2 :(得分:0)

我不明白这种方法有什么问题,如果我想从SQL服务器换成Oracle,我只需注册一个名为&#34; OracleSchoolRepository的新存储库,它确保它满足ISchoolRepository接口。

我没有看到任何问题?当上述问题成为问题时,你能突出一个场景吗?

谢谢!