c# - 从表中查询数据时管理实体的最佳实践?

标签 c# design-patterns domain-driven-design poco dapper

我数据库中的每个表都有它自己的 POCO 类。现在,我已经开始编写复杂的 SQL 连接,查询结果集应该映射到一些可以发送到业务管理器(另一层)以进行进一步处理的实体。例如,假设我的查询返回这样的列(为简单起见,表名以列名为前缀):

Customer.CustomerId,
Customer.CustomerName,
Customer.CustomerAddress,
[User].UserId,
[User].UserName,
[User].FirstName,
[User].LastName,
UserRole.RoleId,
UserRole.RoleName,
Employee.EmployeeId,
Employee.EmployeeName,
Employee.JoinDate,
MAX(AuditTrail.LastLoginDate)
etc

问题:

  1. 我应该使用什么设计模式?
  2. 我应该能够编写多个查询,并在每个查询中检索到一堆混合和匹配列。也许,不是一个 将这种类型的结果集映射到 POCO 类是个好主意吗?
  3. 我可能有其他查询或多或少需要从 SQL 结果集中返回相同类型的列。
  4. 我是否应该维护单独的实体来支持查询?

注意:我正在使用 Dapper ORM 与带有 .NET 4.5 Framework (C#) 的 SQL Server 2012 通信。如果问题不清楚,请告知。

最佳答案

您要找的模式是Data Mapper

A layer of Mappers (473) that moves data between objects and a database while keeping them independent of each other and the mapper itself.

这意味着持久层之外的事物不应该知道任何关于数据库的信息——无论是 ORM 框架还是模仿表结构的 POCO。

因此,在 DDD 的上下文中,这意味着您使用域模型并将 DB POCO 映射到该域模型。数据映射器负责该映射。

实现

您当然可以自己进行映射:在数据映射器中创建一个方法,该方法采用 DB POCO 并返回相应的域对象。但是,如果您有很多映射,则这需要大量样板代码。

为了缓解这种情况,请使用像 AutoMapper 这样的对象到对象映射库.它减少了您为映射编写的代码量,还使映射更易于维护。缺点是你必须学习一个新的库并依赖它。

DB POCO 管理

您的 DB POCO(许多人称为 DTO)应仅服务于一个目的:描述 C# 世界中表或结果集的结构 - 仅此而已。所以是的,为每个返回不同结果结构的查询创建一个 DB POCO。

关于c# - 从表中查询数据时管理实体的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265230/

相关文章:

c# - 从 IIS 7 asp.net c# 获取 .ini 文件

java - 无需AOP框架即可动态添加方面的软件设计

java - 我应该使用泛型来解决这个问题吗?

java - 如何实现对两个相同类的一个引用?

c# - 实现一个接口(interface),泛型基于该接口(interface)

c# - 调用Delphi dll函数时PInvokeStackImbalance

c# - 从 Parallel.ForEach 循环内部调用异步方法时出现无效操作异常

php - 在 MVC 框架中实现 DDD - PHP

node.js - 如何在模块中构建nodejs应用程序?

domain-driven-design - 如果域事件失败怎么办?