代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

我是否在MVVM设计模式中从ViewModel或Model调用我的服务?

  •  3
  • Elisabeth  · 技术社区  · 15 年前

    我在这里问了另一个问题,一个用户真的很困惑,我建议这样做:我已经在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 回复  |  直到 15 年前
        1
  •  1
  •   codekaizen    15 年前

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

    如果实体之间存在依赖关系,会发生什么?例如,学校有学生。除非你救了学校,否则你不能救学生。你必须把这个逻辑构建到你的学生实体中。你的学生也会拯救学校吗?他们会拒绝拯救吗?他们需要检查学校的数据库吗?他们至少需要了解学校的一些情况,这样你就可以在学校和学生之间建立起一种依赖关系,这种依赖关系是很硬的。

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

    了解这些东西是存储库的责任。

    高温高压

    干杯

        2
  •  0
  •   SRM    15 年前

    从您的实体调用服务违反了单一责任原则。如果将来,你需要让你的实体从一个不同的后备仓库中补充水分,而不是你必须改变所有实体的服务。即使您正在注入存储库,它仍然违反SRP。

        3
  •  0
  •   BenjaminPaul    15 年前

    我不明白这种方法有什么问题,如果我想从say sql server换成oracle,我只需注册一个名为“oracleschoolrepository”的新存储库,它可以确保它满足ischoolrepository接口。

    我看不出有什么问题吗?当上述问题出现时,您能突出显示一个场景吗?

    谢谢!

    推荐文章