DTO 与领域模型,项目组织
DTO vs. Domain Model, project organization
我有一个带有存储库和服务层的项目,使用 EF6 和代码优先 POCO。在 CustomerRepository 中,我正在做几个 return 对象的投影查询。
我知道代码优先的 POCO 将被视为“领域模型”,但如果我要对不同的模型进行投影查询,该模型是什么? CustomerOrderStats
就是一个例子。那仍然是领域模型,还是应该被视为 DTO 模型?
示例
对象 return 来自存储库:
public class CustomerOrderStats
{
public string Name { get; set; }
public int Count { get; set; }
}
在存储库中查询
public CustomerOrderStats GetCustomerOrderStats(Guid customerGuid)
{
return customers
.Where(c => c.Guid == customerGuid)
.Select(new CustomerOrderStats
{
Name = c.Name,
Count = c.Orders.Count()
};
}
它可以是任何一个,真的。模型与 DTO 的定义实际上并不是您如何组织任何给定框架的问题,而是该对象在域中表示的内容。如果它具有丰富的功能或业务逻辑,或者是实际业务流程的活跃部分,那么它可能是一个模型。另一方面,如果它只是将值从一个地方移动到另一个地方的属性容器,则它可能是 DTO。
这里的关键是对象是否是业务流程的活动部分。这里的一个好的经验法则通常是对象的 name。
- 非技术业务团队成员理解的名称吗?
- 这是他们用来描述业务的术语吗? (即使是很小一部分业务)
- 它在行业中具有普遍意义吗?
DTO 通常是纯粹出于技术原因而存在的东西。组件 A 需要向组件 B 发送数据,但该操作是技术操作而不是业务操作。数据只需要传输。作为系统的一部分,它本质上是构建的 "from the bottom up" 因为它满足了低级技术需求。
模型描述了业务的一部分。它可以是图表上以非技术术语定义业务流程的元素,也可以是业务概念的封装。作为系统的一部分,它本质上是构建的 "from the top down" 因为它通常由业务描述,然后专门实施以满足该需求。
我有一个带有存储库和服务层的项目,使用 EF6 和代码优先 POCO。在 CustomerRepository 中,我正在做几个 return 对象的投影查询。
我知道代码优先的 POCO 将被视为“领域模型”,但如果我要对不同的模型进行投影查询,该模型是什么? CustomerOrderStats
就是一个例子。那仍然是领域模型,还是应该被视为 DTO 模型?
示例
对象 return 来自存储库:
public class CustomerOrderStats
{
public string Name { get; set; }
public int Count { get; set; }
}
在存储库中查询
public CustomerOrderStats GetCustomerOrderStats(Guid customerGuid)
{
return customers
.Where(c => c.Guid == customerGuid)
.Select(new CustomerOrderStats
{
Name = c.Name,
Count = c.Orders.Count()
};
}
它可以是任何一个,真的。模型与 DTO 的定义实际上并不是您如何组织任何给定框架的问题,而是该对象在域中表示的内容。如果它具有丰富的功能或业务逻辑,或者是实际业务流程的活跃部分,那么它可能是一个模型。另一方面,如果它只是将值从一个地方移动到另一个地方的属性容器,则它可能是 DTO。
这里的关键是对象是否是业务流程的活动部分。这里的一个好的经验法则通常是对象的 name。
- 非技术业务团队成员理解的名称吗?
- 这是他们用来描述业务的术语吗? (即使是很小一部分业务)
- 它在行业中具有普遍意义吗?
DTO 通常是纯粹出于技术原因而存在的东西。组件 A 需要向组件 B 发送数据,但该操作是技术操作而不是业务操作。数据只需要传输。作为系统的一部分,它本质上是构建的 "from the bottom up" 因为它满足了低级技术需求。
模型描述了业务的一部分。它可以是图表上以非技术术语定义业务流程的元素,也可以是业务概念的封装。作为系统的一部分,它本质上是构建的 "from the top down" 因为它通常由业务描述,然后专门实施以满足该需求。