EF Core、服务和存储库模式
EF Core, Service and Repository patterns
为了了解模式,我正在使用这些项目创建我的 Web API:
实体、存储库、服务和 API 应用程序。
APIs 中的每个控制器都对其相应的服务使用依赖注入;每个服务使用 DI 到多个存储库;存储库用于从 DbContext 获取数据,实体包含 DbContext 和 DbSets。
例如,当我调用 /teams/1 端点时:
- 控制器调用中的
GetTeam(id)
函数_teamService.GetTeam(id);
- 服务调用
_teamRepository.GetTeam(id);
- 存储库执行 LINQ 调用
Context.Team.First(...)
将团队实体模型返回给服务;
- 服务获取模型并将其映射到返回控制器的 DTO;
- 控制器以 JSON 格式将其提供给应用程序。
这是管理流程的正确方法吗?
此外,假设控制器必须检索团队及其所有比赛:注入 CompetitionRepository 并从 TeamService 中使用它是否正确?类似于:
TeamService.cs
return new DTOObject {
team = _teamRepo.GetTeam(id),
competitions = _compRepo.GetCompsByTeam(id) <-- is a list
}
我更喜欢 return 我服务中的实体而不是 DTO。原因是有时服务调用的结果用于创建 ASP.NET MVC 视图模型,有时用于 return 作为 JSON 的 DTO。有时对这些 DTO 的要求是不同的,服务器端 ViewModels 可以看到不应该暴露给客户端的东西。你可以在你的服务层创建一个 DTO,但在大多数情况下,它只是你必须处理的另一个映射,没有那么大的价值。这就是我直接从控制器中的实体创建 DTO 或 ViewModel 的原因。
此外,存储库模式几乎没有用。如果您更改数据存储,这可能会有用,但实际上这些类型的更改伴随着对业务逻辑的许多其他更改,因此您的大部分服务层无论如何都会被重写,因此价值会丢失。
为了了解模式,我正在使用这些项目创建我的 Web API: 实体、存储库、服务和 API 应用程序。
APIs 中的每个控制器都对其相应的服务使用依赖注入;每个服务使用 DI 到多个存储库;存储库用于从 DbContext 获取数据,实体包含 DbContext 和 DbSets。
例如,当我调用 /teams/1 端点时:
- 控制器调用中的
GetTeam(id)
函数_teamService.GetTeam(id);
- 服务调用
_teamRepository.GetTeam(id);
- 存储库执行 LINQ 调用
Context.Team.First(...)
将团队实体模型返回给服务; - 服务获取模型并将其映射到返回控制器的 DTO;
- 控制器以 JSON 格式将其提供给应用程序。
这是管理流程的正确方法吗?
此外,假设控制器必须检索团队及其所有比赛:注入 CompetitionRepository 并从 TeamService 中使用它是否正确?类似于:
TeamService.cs
return new DTOObject {
team = _teamRepo.GetTeam(id),
competitions = _compRepo.GetCompsByTeam(id) <-- is a list
}
我更喜欢 return 我服务中的实体而不是 DTO。原因是有时服务调用的结果用于创建 ASP.NET MVC 视图模型,有时用于 return 作为 JSON 的 DTO。有时对这些 DTO 的要求是不同的,服务器端 ViewModels 可以看到不应该暴露给客户端的东西。你可以在你的服务层创建一个 DTO,但在大多数情况下,它只是你必须处理的另一个映射,没有那么大的价值。这就是我直接从控制器中的实体创建 DTO 或 ViewModel 的原因。
此外,存储库模式几乎没有用。如果您更改数据存储,这可能会有用,但实际上这些类型的更改伴随着对业务逻辑的许多其他更改,因此您的大部分服务层无论如何都会被重写,因此价值会丢失。