C#数据层和Dto';s

C#数据层和Dto';s,c#,architecture,data-access-layer,C#,Architecture,Data Access Layer,我最近加入了一家使用类型化数据集作为“Dto”的公司。我认为他们真的是垃圾,想把它改成更现代、更人性化的东西。因此,我正在尝试更新代码,使数据层更通用,即使用接口等,另一个人不知道什么是Dto,我们对应该如何做略有分歧 我不想让人们改变我的思维方式,我想从你们那里得到公正的答案,关于Dto可以存在于哪些层面。各层;DAL、BL和表示或仅在这些层中的一个小子集 另外,IList对象是否应该出现在DAL中 谢谢。一件事是数据集在实现互操作性方面很差。当从非.net客户端使用类型化数据集时,即使是类型

我最近加入了一家使用类型化数据集作为“Dto”的公司。我认为他们真的是垃圾,想把它改成更现代、更人性化的东西。因此,我正在尝试更新代码,使数据层更通用,即使用接口等,另一个人不知道什么是Dto,我们对应该如何做略有分歧

我不想让人们改变我的思维方式,我想从你们那里得到公正的答案,关于Dto可以存在于哪些层面。各层;DAL、BL和表示或仅在这些层中的一个小子集

另外,IList对象是否应该出现在DAL中


谢谢。

一件事是数据集在实现互操作性方面很差。当从非.net客户端使用类型化数据集时,即使是类型化数据集也不太兼容。参考如果您必须实现互操作性,那么请努力争取DTO,否则请尝试让您的团队在一段时间内理解DTO,因为数据集毕竟不是那么糟糕

在接口方面,是的,您应该公开接口。例如,如果要从DAL返回
列表
,则应返回
IList
。有些人只返回
IEnumerable
,因为您所需要的只是枚举功能。但是当你做的时候,你就不会变成这样

在我的应用程序中,我发现返回
IList
而不是
List
会用如下代码污染我的代码库:

//consider personCollection as IList<Person>
(personCollection as List<Person>).ForEach(//Do Something)
//将personCollection视为IList
(personCollection作为列表).ForEach(//做某事)

所以我个人试图在返回接口或具体对象之间保持平衡。如果你问我现在在做什么,我会告诉你我正在返回
List
。我受影响而不想成为。

我总是使用DTO,从不使用DataTable。但我只使用它们从BL传输到DL,反之亦然。在面向服务的情况下,我的表示层通常只知道业务层和服务层

我可以看到使用DTO而不是数据表的好处:

  • 易于重构
  • 简易图表制作
  • 更干净更可读的代码,特别是在DAL的单元测试中

  • 根据定义,DTO是一种数据传输对象,用于(等待)将数据从一层传输到另一层


    DTO可以跨所有层使用,我在web服务中使用得很好。

    这取决于您的体系结构

    在大多数情况下,您应该尝试编写接口的代码,那么您的实现是什么并不重要。如果您返回ISomething,它可能是您的SomethingEntity或您的SomethingDTO,但您的消费代码并不关心,只要它实现了接口

    您应该在具体集合或数组上返回IList/ICollection/IEnumerable

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


    如果你真的开始使用界面,我建议你尽早集成像温莎这样的国际奥委会。如果你一开始就这样做,以后事情会变得更容易。

    @leppie:请参阅Data Transfer Object-一个业务域对象(或多个对象)的轻量级和(通常)上下文无关版本。抱歉,leppie,我不应该假设每个人都知道首字母缩写。谢谢vc-直截了当地回答我的问题,有没有关于将Dto绑定到IEnumerable或类似文件中的意见?例如,您的意思是允许DAL中的GetCustomers方法返回CustomerTo的IList或IEnumerable?如果是这样的话,我看不出你有什么理由不允许。谢谢vc——这正是我的意思。汉克斯·伯特,我喜欢你“揭示”DTO是什么的方式:)别担心,看看领域驱动设计,因为DTO是其中的特色。这里有一些关于如何使用DDD构建具有复杂业务规则的解决方案的优秀示例。这里有几个链接供您参考这是我想介绍的更多路线,特别是IoC和依赖注入技术,事实上,这就是我试图向办公室里的其他开发人员解释的。不返回通用列表是有原因的。这取决于返回列表的对象是公共的还是私有的。只要您没有在公共界面上公开列表,这并不重要,因为只有您在使用它。是的,如果public意味着被应用程序之外的人使用,我同意。不应将Public推断为访问说明符,如果项目中的某个层总是使用Public返回类型,而该层在一个应用程序之外永远看不到光,则将Public返回类型公开为接口也没有意义。