在某些情况下,我可以从我的存储库中 return DTO 吗?
Can I return DTO from my repository in some cases?
我的 "domain assembly" 中有两个实体。
Message
- Id
- Title
- Content
- IsMandatoryReading
MessageUser
- MessageId
- UserId // The user who already read the message
在我的 "Infrastructure assembly" 中,我有 MessageRepository,方法有 Save、Delete、GetAll、GetMany、FindById 等,都引用了实体 Message。
现在,我想向用户显示所有标记为他未读过的消息。所以,我创建了方法:
public ICollection<MessageToUserDto> GetMessagesToUser( int userId ) { ... }
实体 Message 和 DTO MessageToUserDto 之间的唯一区别是 "IsRead" 属性 它将确定消息是否已被用户阅读。
DTO:
MessageToUserDto
- Id
- Title
- Content
- IsMandatory
- IsRead
我在某个地方读到,使用存储库到 return DTO 不是一个好主意。
但在这种情况下,什么会更好?我需要担心这种方法吗?我做错了什么?
DTO的概念实际上起源于DAO模式,该模式在DDD(领域驱动设计)中被域对象.
这意味着DDD的纯Repository pattern推荐给return一个Domain Object,这实际上意味着一个POCOEntity 如果需要 LinQ 和持久性无知(这是 C# 中 DDD 的推荐方法)。
这意味着您只需拥有这些 POCO,并以 DTO 的角色使用它们在层之间传递数据,以在存储库内的 LinQ 中持久化并作为存储库本身的参数。
所有用途的这种统一性是一种理想的质量,并且可以使重构、代码的可读性和清晰度变得不可能,否则是不可能的。
如果您需要添加行为(如 MessageToUserDto
),请不要忘记您可以从另一个派生 POCO...
我的 "domain assembly" 中有两个实体。
Message
- Id
- Title
- Content
- IsMandatoryReading
MessageUser
- MessageId
- UserId // The user who already read the message
在我的 "Infrastructure assembly" 中,我有 MessageRepository,方法有 Save、Delete、GetAll、GetMany、FindById 等,都引用了实体 Message。
现在,我想向用户显示所有标记为他未读过的消息。所以,我创建了方法:
public ICollection<MessageToUserDto> GetMessagesToUser( int userId ) { ... }
实体 Message 和 DTO MessageToUserDto 之间的唯一区别是 "IsRead" 属性 它将确定消息是否已被用户阅读。
DTO:
MessageToUserDto
- Id
- Title
- Content
- IsMandatory
- IsRead
我在某个地方读到,使用存储库到 return DTO 不是一个好主意。
但在这种情况下,什么会更好?我需要担心这种方法吗?我做错了什么?
DTO的概念实际上起源于DAO模式,该模式在DDD(领域驱动设计)中被域对象.
这意味着DDD的纯Repository pattern推荐给return一个Domain Object,这实际上意味着一个POCOEntity 如果需要 LinQ 和持久性无知(这是 C# 中 DDD 的推荐方法)。
这意味着您只需拥有这些 POCO,并以 DTO 的角色使用它们在层之间传递数据,以在存储库内的 LinQ 中持久化并作为存储库本身的参数。
所有用途的这种统一性是一种理想的质量,并且可以使重构、代码的可读性和清晰度变得不可能,否则是不可能的。
如果您需要添加行为(如 MessageToUserDto
),请不要忘记您可以从另一个派生 POCO...