将数据库实体映射到模型和执行业务逻辑的最佳实践是什么?我已经看到了两者的相当不同的实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库:
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
但是在对 SO on N Tier 设计进行全面搜索后,我注意到虽然没有灵丹妙药,但在大多数情况下,建议手动或使用 Mapper 在 MVC 项目中的控制器内部执行映射。还重申了服务层永远不应该执行映射,它的职责应该是执行业务逻辑。这里有几个问题:
- 关于将实体映射到模型的位置以及反之亦然,哪种方法是可取的?存储库应该这样做还是应该在控制器中完成映射?
- 假设我想对我从数据库中检索到的实体执行一些业务逻辑,例如返回实体的全名
Person
,或者将所有s的年龄增加Person
10年,这个操作应该在哪里执行。在模型本身?例如,我会FullName
在模型上有一个属性来计算全名和年龄吗?或者我是否在我的服务层中定义了一些服务来执行业务逻辑?
编辑
哇这么多接近的票。抱歉,我搜索的不够全面。我在这里提出的“在哪里执行业务逻辑”问题已经可以在 SO 和其他地方找到(尽管有时传达得有些神秘):
但是,我还没有找到解决映射问题的标准解决方案,我想我或许可以更雄辩地表达我的问题。所以普遍的共识似乎是业务逻辑进入服务层,将领域模型映射到视图模型应该发生在控制器/表示层。并且由于建议不要将您的数据库实体显示到数据层以外的任何层,因此建议您手动或通过诸如 Auto Mapper 之类的映射器将您的实体映射到数据层的域模型(这是我从阅读许多文章)。我的困惑源于应该将实体映射到域模型以及将域模型映射到视图模型的问题。然而,正如我之前提到的那样,我本可以更清楚地表达我的问题。