我最近加入了一家使用类型化数据集作为'Dto'的公司。我认为它们真的很垃圾,并希望将它改成更现代和用户友好的东西。所以,我正在尝试更新代码,以便数据层更通用,即使用接口等,另一个人不知道Dto是什么,我们对如何做到这一点略有不同意见。
如果不试图让人们按照我的思维方式进行思考,我希望得到人们关于Dto可以存在的层次的公正答案。所有层次; DAL,BL和Presentation或仅在这些图层中设置一个小子集。
此外,是否应该或不应该在DAL中存在IList对象。
感谢。
答案 0 :(得分:5)
这取决于你的架构。
在最重要的一点上,您应该尝试对接口进行编码,然后实现的内容并不重要。如果您返回ISomething,它可能是您的SomethingEntity或您的SomethingDTO,但只要它实现接口,您的消费代码就不会少用。
您应该在具体集合或数组上返回IList / ICollection / IEnumerable。
首先应该尝试做的是分离代码并通过在层之间插入一些接口(例如DataAccess层的存储库)使其松散耦合。然后,您的存储库将返回由接口封装的实体。这将使您的代码更易于测试,并允许您更轻松地进行模拟。一旦完成测试,您就可以开始以较低的风险更改实施。
如果您确实开始使用接口,我建议尽早而不是稍后集成像Windsor这样的IoC。如果你从一开始就这样做,那么以后会更容易。
答案 1 :(得分:2)
有一件事是DataSet无法实现互操作性。甚至类型化数据集在从非.net客户端使用类型化数据集时也不太兼容。请参阅this link。如果你必须实现互操作性,那么就要努力争取DTO,否则试着让你的团队在一段时间内理解DTO,因为数据集毕竟不是那么糟糕。
在接口的一部分上,是的,你应该暴露接口。例如 - 如果您从DAL返回List<T>
,则应返回IList<T>
。有些人只返回IEnumerable<T>
,因为您需要的只是枚举的能力。但是在这样做的同时不会成为astronaut architect。
在我的应用程序中,我发现返回IList<T>
而不是List<T>
会使用以下代码污染我的代码库:
//consider personCollection as IList<Person>
(personCollection as List<Person>).ForEach(//Do Something)
所以我个人试着在返回界面或具体对象之间保持平衡。如果你问我现在在做什么,那么我会告诉你我要回来List<T>
。我受影响不要成为astronaut architect。
答案 2 :(得分:1)
我总是使用DTO,而不是DataTable。但我只使用它们从BL转移到DL,反之亦然。在面向服务的情况下,我的表示层通常只知道业务和服务层。
我可以看到使用DTO而不是数据表的好处:
答案 3 :(得分:1)
根据定义,DTO是一个数据传输对象,用于(等待它)将数据从一个层传输到另一个层。
DTO可以在所有图层中使用,我已经很好地使用它们与Web服务。