将数据库实体映射到模型并执行业务逻辑的最佳实践是什么?我已经看到了两个不同的实现。我注意到了一些实现,其中Repository(在数据层中)本身负责将数据库实体映射到域模型。例如,一个存储库这样做:将实体映射到模型并在ASP.NET MVC中执行业务逻辑
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
不过话说搜索全面周围SO N个双层设计,我注意到,虽然没有银弹,在大多数情况下,这是最好的内部执行映射MVC项目中的控制器手动或使用Mapper。还有人重申,服务层不应该执行映射,并且应该负责执行业务逻辑。这里有几个问题:
- 哪种方法对于将实体映射到模型以及反之亦然是可取的?存储库应该这样做还是应该在控制器中完成映射?
- 假设我想对从数据库中检索到的实体执行一些业务逻辑,例如返回
Person
实体的全名,或者将所有Person
的年龄增加10年,应该在何处操作被执行。在模型本身?例如,我会在模型上有一个FullName
属性来计算全名和年龄?还是我在我的服务层中定义一些服务来执行业务逻辑?
编辑
哇这么多的接近票数。道歉,我没有足够全面的搜索。我在这里提出的“在何处执行业务逻辑”的问题已经可以在SO和其他地方发现的(虽然有时有点传达含糊):
Validating with a Service Layer by Stephen Walther
Another great, but more generic answer here on SO
Where Should I put My Controller Business Logic in MVC
Does a Service Map Entities to a View Model
但是我还没有找到标准的解决方案来解决映射问题,而且我想我可能更加雄辩地表达了我的问题。因此,普遍的共识似乎是业务逻辑进入服务层,并且将域模型映射到视图模型应该发生在控制器/表示层中。由于不建议将数据库实体映射到数据层以外的任何层,因此建议您将实体映射到数据层的域模型,可以手动或通过映射器(如Auto Mapper)进行映射(这是我从中收集的阅读很多文章)。我的疑惑出现在将实体映射到域模型和映射域模型以查看模型的位置的问题。不过,正如我之前提到的,我可以更清楚地表达我的问题。造成混淆的原因是我已经阅读过映射实体到域模型应该发生在控制器中,这应该改为说:“将实体映射到域模型应该在稍后发生在数据上,并且映射域模型以查看模型应该发生在控制器中