在某些情况下,我可以从我的存储库返回DTO吗?

时间:2015-05-18 23:00:42

标签: c# entity-framework design-patterns repository dto

我的"域程序集中有两个实体"。

Message
- Id
- Title
- Content
- IsMandatoryReading

MessageUser
- MessageId 
- UserId        // The user who already read the message

在我的"基础设施组装"我有MessageRepository,其方法有Save,Delete,GetAll,GetMany,FindById等,都引用实体Message。

现在,我想向用户显示标记他没有阅读过的所有消息。所以,我创建了方法:

public ICollection<MessageToUserDto> GetMessagesToUser( int userId ) { ... }

实体Message和DTO MessageToUserDto之间的唯一区别是&#34; IsRead&#34;将确定消息是否已被用户读取的属性。

DTO:

MessageToUserDto
- Id
- Title
- Content
- IsMandatory
- IsRead

我在某处读到使用存储库返回DTO不是一个好主意。

但在这种情况下会更好吗?我需要担心这种方法吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

DTO 的概念实际上源于 DAO 模式,该模式已在DDD(域驱动设计)中被域对象

这意味着DDD的纯存储库模式建议返回域对象,如果LinQ和持久性无知,实际上意味着POCO 实体需要(这是C#中DDD的推荐方法)。

这意味着您只需拥有这些POCO,并在DTO的角色中使用它们在层之间传递数据,在存储库内的LinQ中持久化,并作为存储库本身的参数。

所有用途的这种一致性是一种理想的质量,并且使得重构,可读性和代码清晰度变得容易实现。

如果您需要添加行为(如MessageToUserDto中所述),请不要忘记您可以从其他人那里获得POCO ......