我在这里问另一个问题,一个用户真的很困惑我建议做以下事情:我已经在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)
}
}
答案 0 :(得分:1)
我不会将存储库与实体混合,因为我喜欢实体没有任何上下文或环境状态。我认为管理实体的存储是存储库的唯一责任。
如果您在实体之间存在依赖关系会发生什么?例如,一所学校有学生。在拯救学校之前,您无法保存学生。您必须将此逻辑构建到学生实体中。你的学生也会拯救学校吗?他们会拒绝拯救吗?他们需要检查学校的数据库吗?他们至少需要了解一下学校的情况,这样你就可以在学校和学生之间建立一种非常难以接受的依赖。
然后你添加老师,你需要为他们添加类似的逻辑。然后,代表这些关系和依赖关系的代码将分布在许多实体中。考虑交易。然后添加多个层。你看到这会变得多么复杂吗?很快你就会有意大利面配肉丸和奶酪!
知道这些东西是存储库的责任。
HTH
干杯
答案 1 :(得分:0)
从您的实体调用服务违反了单一责任原则。如果将来需要让您的实体从与服务不同的后备存储中保持水分,您将需要更改所有实体。即使您正在注入存储库,它仍然违反了SRP。
答案 2 :(得分:0)
我不明白这种方法有什么问题,如果我想从SQL服务器换成Oracle,我只需注册一个名为&#34; OracleSchoolRepository的新存储库,它确保它满足ISchoolRepository接口。
我没有看到任何问题?当上述问题成为问题时,你能突出一个场景吗?
谢谢!
本