C# 数据层和数据传输对象(Dto)

5

我最近加入了一家公司,他们将类型化数据集用作他们的'Dto'。我认为它们很糟糕,并希望将其更改为更现代和用户友好的东西。因此,我正在尝试更新代码,使数据层更加通用,即使用接口等,另一个人不知道什么是Dto,我们在如何做这件事上有点分歧。

不想影响别人的思维方式,我想从你们这些人那里获得公正的答案,关于Dto可以出现在哪些层。所有层;DAL、BL和Presentation或者仅存在于这些层中的一小部分。

此外,IList对象是否应该存在于DAL中。

谢谢。


2
@leppie:请看http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html。 - tsimbalar
1
数据传输对象 - 是业务领域对象(或对象)的轻量级和(通常)无上下文版本。 - Mitch Wheat
抱歉leppie,我不应该假设每个人都知道缩略语。 - Mr. Mr.
4个回答

5

这取决于您的架构。

大多数情况下,您应该尝试编写接口代码,然后实现并不重要。如果您返回ISomething,它可以是SomethingEntity或SomethingDTO,但只要它实现了接口,消费代码就不会在意。

您应该返回一个IList/ICollection/IEnumerable而不是具体的集合或数组。

首先应该尝试将代码分离,并通过在层之间插入一些接口(例如DataAccess层的存储库)使其松散耦合。然后,您的存储库将返回由接口封装的实体。这将使您的代码更易于测试,并允许您更轻松地进行模拟。一旦您有了测试,就可以开始更轻松地更改实现。

如果您开始使用接口,我建议尽早集成IoC(例如Windsor)。如果从一开始就这样做,以后的事情会更容易。


这更符合我想要的路线,特别是IoC和依赖注入技术,事实上这正是我试图向办公室里的另一位开发人员解释的内容。 - Mr. Mr.

2
一件事是,数据集在实现互操作性方面表现不佳。即使是类型化的数据集,在从非 .net 客户端使用类型化数据集时也不太兼容。请参考此链接。如果您需要实现互操作性,则应该努力争取使用 DTOs,否则尝试让团队逐渐理解 DTOs,因为数据集并不是那么糟糕。
关于接口,是的,您应该暴露接口。例如 - 如果您从 DAL 返回 List<T>,则应该返回 IList<T>。有些人甚至只返回 IEnumerable<T>,因为您只需要枚举的能力。但是在这样做时,不要成为宇航员架构师
在我的应用程序中,我发现返回 IList<T> 而不是 List<T> 会污染我的代码库,像这样的代码:
//consider personCollection as IList<Person>
(personCollection as List<Person>).ForEach(//Do Something)

所以我个人尽量保持返回接口或具体对象之间的平衡。如果你问我现在在做什么,那么我会告诉你我正在返回List<T>。我受到不成为太空人架构师的影响。


2
不返回通用列表的原因是有道理的http://msdn.microsoft.com/en-US/library/ms182142(v=VS.80).aspx。这取决于返回列表的对象是公共的还是私有的。只要您不在公共接口上公开列表,就没有关系,因为只有您在使用它。 - Bronumski
1
是的,我同意如果public意味着被应用程序外部的某人使用。Public不应被推断为访问说明符,并且如果它总是由项目中的某个层消耗,该层永远不会在一个应用程序之外看到光,那么公共返回类型作为接口的暴露就没有意义。 - Pradeep

1
我总是使用DTO,从不使用DataTable。但我只用它们来在BL和DL之间进行传输。如果面向服务,我的表示层通常只知道业务和服务层。
我可以看到使用DTO而不是数据表的好处:
  • 易于重构
  • 易于制作图表
  • 更干净、更易读的代码,特别是在DAL的单元测试中

谢谢vc - 直接回答我的问题,您认为将Dto捆绑到IEnumerable或类似的集合中是否可行? - Mr. Mr.
你的意思是在DAL中允许一个GetCustomers方法返回CustomerDTO的IList或IEnumerable吗?如果是这样,我不认为你不应该允许它。 - vc 74
谢谢vc - 这正是我想表达的。 - Mr. Mr.

1

根据定义,DTO是数据传输对象,用于(等待它)在不同层之间传输数据。

DTO可以在所有层中使用,我已经成功地将它们与Web服务一起使用。


1
谢谢Burt,我喜欢你“揭示”DTO的方式 :) - Mr. Mr.
放心,看一下领域驱动设计,因为DTO是其中的特色。有一些非常好的例子展示了如何使用DDD架构解决复杂业务规则的问题。 - Burt
这里有几个链接供您参考 http://dddpds.codeplex.com/ http://ncommon.codeplex.com/ - Burt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接