在将数据库实体映射到模型并执行业务逻辑方面,最佳实践是什么?我看到了很多不同的实现方式。我注意到一些实现中,存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,一个能够做到这一点的存储库:
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
综合搜索了许多关于N层设计的SO问题,我注意到虽然没有银弹,但在大多数情况下建议在MVC项目的控制器中手动映射或使用映射器执行映射。还反复强调,服务层不应执行映射,其责任应是执行业务逻辑。这里有几个问题:
- 在将实体映射到模型和反之处于哪种方法是可取的?存储库是否应该这样做,还是映射应在控制器中完成?
- 假设我想对从数据库检索到的实体执行一些业务逻辑,例如返回所有人的全名或将所有人的年龄增加10岁,那么应该在哪里执行此操作?在模型本身上吗?例如,我的模型上会有一个
FullName
属性来计算全名和年龄吗?还是在我的服务层内定义一些服务来执行业务逻辑?
编辑
哇,竟然有这么多关闭投票。抱歉,我没有充分搜索。我在这里提出的“在哪里执行业务逻辑”问题已经可以在SO和其他地方找到(尽管有时表达得有点隐晦):
Stephen Walther的Service Layer验证
然而,我尚未找到标准的解决方案来回答我之前提出的映射问题。我认为我可能可以更优美地表达我的问题。总体而言,业界一致认为业务逻辑应该在服务层中处理,并且将领域模型映射到视图模型应该在控制器/表示层中进行。由于不建议将DB实体暴露给除Data层以外的任何层,因此推荐在数据层手动或通过诸如Auto Mapper之类的映射器将实体映射到领域模型(这是我从阅读许多文章中得出的结论)。我的困惑来自于在哪里进行实体到领域模型的映射和领域模型到视图模型的映射的问题。但正如我之前所提到的,我可能可以更清楚地表达我的问题。我的困惑是因为我曾经读到过将实体映射到领域模型应该在控制器中进行,而这应该重新说成“将实体映射到领域模型应该在数据层进行,并且将领域模型映射到视图模型应该在控制器中进行。”