【发布时间】:2012-12-23 11:19:11
【问题描述】:
将数据库实体映射到模型和执行业务逻辑的最佳做法是什么?我已经看到了两者的相当不同的实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库:
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 设计进行全面搜索后,我注意到虽然没有灵丹妙药,但在大多数情况下,建议手动或使用映射器在 MVC 项目中的控制器内部执行映射。还重申了服务层永远不应该执行映射,它的职责应该是执行业务逻辑。这里有几个问题:
- 在将实体映射到模型的位置(反之亦然)方面,哪种方法是可取的?存储库应该这样做还是应该在控制器中完成映射?
- 假设我想对从数据库中检索到的实体执行一些业务逻辑,例如返回
Person实体的全名,或者将所有Persons的年龄增加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 之类的映射器将您的实体映射到数据层的域模型(这是我从阅读许多文章)。我的困惑源于应该将实体映射到域模型以及将域模型映射到视图模型的问题。然而,正如我之前提到的那样,我本可以更清楚地表达我的问题。我感到困惑的原因是我已经读过将实体映射到域模型应该发生在控制器中,这应该改写为“将实体映射到域模型应该稍后发生在数据中,并将域模型映射到视图模型应该在 Controller 中进行。
【问题讨论】:
标签: asp.net-mvc architecture n-tier-architecture