在某些情况下,我可以从我的存储库中 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...