Asp.net mvc 在ASP.NET MVC中将实体映射到模型并执行业务逻辑
将数据库实体映射到模型并执行业务逻辑的最佳实践是什么?我已经看到了这两种方法的不同实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库:Asp.net mvc 在ASP.NET MVC中将实体映射到模型并执行业务逻辑,asp.net-mvc,architecture,n-tier-architecture,Asp.net Mvc,Architecture,N Tier Architecture,将数据库实体映射到模型并执行业务逻辑的最佳实践是什么?我已经看到了这两种方法的不同实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库: public IQueryable<Person> GetPersons() { return DbSet.Select(s => new Person { Id = s.Id,
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
publicIQueryable GetPersons()
{
返回DbSet.Select(s=>newperson
{
Id=s.Id,
FirstName=s.FirstName,
姓氏,
位置=s.位置,
});
}
但是在全面搜索了N层设计之后,我注意到虽然没有银弹,但在大多数情况下,建议手动或使用映射器在MVC项目的控制器内部执行映射。还有人重申,服务层永远不应该执行映射,它的责任应该是执行业务逻辑。这里有几个问题:
人员
的全名,或者将所有人员
的年龄增加10年,应该在哪里执行此操作。关于模型本身?例如,我会在模型上有一个FullName
属性来计算全名和年龄吗?还是在我的服务层中定义一些服务来执行业务逻辑然而,我还没有找到一个标准的解决方案来解决我的映射问题,我想我也许可以更雄辩地表达我的问题。因此,普遍的共识似乎是业务逻辑在服务层,而将域模型映射到视图模型应该在控制器/表示层进行。由于不建议将DB实体表面化到数据层以外的任何层,因此建议手动或通过映射器(如Auto mapper)将实体映射到数据层的域模型(这是我从阅读许多文章中收集到的)。我的困惑源于将实体映射到域模型和将域模型映射到视图模型的问题。然而,正如我先前提到的,我本可以更清楚地表达我的问题。我感到困惑的原因是,我读到,实体到域模型的映射应该发生在控制器中,这应该被重新表述为“将实体映射到域模型应该稍后在数据中进行,将域模型映射到视图模型应该在控制器中进行。我通常在MVC项目中创建一个小型服务层,以处理MVC层需要完成的额外工作。因此,在您的示例中,您可以有一个
PersonService
或PersonHandler
,它调用您的业务层来获取所有人员实体,然后将所有人员的年龄增加10岁(假设这不是您的业务逻辑,而是UI需要的东西),连接名字和姓氏以构建全名等。控制器然后只调用此服务,永远不知道幕后发生了什么。这样,您的控制器就完成了理想情况下应该做的事情——在视图和模型之间进行协调
- 控制器处理来自视图的请求并将其转发给 存储库
- 存储库是通向数据存储的管道
- 服务处理来自存储库的请求,处理业务逻辑, 并返回映射模型