我很困惑,当我们使用ADO时,我应该在所有层(PL,BL和DL)中将DTO与数据协定(出于安全考虑停止使用某些数据契约)结合使用。网络与数据库进行通信。 或者最好有两个不同的模型,一个用于映射数据库中的数据,然后使用映射器在视图模型中进行映射。 请为这两种方法提供一些利弊帮助。 预先感谢
答案 0 :(得分:1)
它通常更好的维护一组的DTO的要暴露于外的消费者。一个很好的理由这样做,这是你可以定制你暴露给消费者带来什么。
另一个原因这样做是将DTO的在溶液中其自己的项目隔离。然后,您可以从该项目中制作一个NuGet程序包。
答案 1 :(得分:1)
您可以在这里Correctly Mapping viewmodel to entity看到我的答案
它是为什么使用提到DTO
的不同层之间是有用的,但在下面的描述中详细定义什么时候应该使用DTO
:
1- 团队,有5人以上。这种规模开始,球队将划分和架构需要考虑到这一点(只是一个侧面说明:在phenomenom一个系统对应的开发团队的结构的建筑被称为Conway´s law)。如果团队分散,后端和演示之间的紧密耦合是不可接受的,因此我们需要DTOs
来防止这种情况。
2- 团队,它们分布在多个位置。最坏的例子是使用某种近岸或离岸模型的项目。
3- 需要在后端的域模型与表示层之间建立复杂的映射功能。
4- 普通团队,您的团队中有初级开发人员或仅Web开发人员。的使用DTOs
允许他们使用的后端服务作为一个“黑盒子”。
5- 减少,减少了后端和演示之间的开销。 DTOs
可为某些服务调用优化。优化的DTO
只包含绝对需要的那些属性。最典型的例子是搜索服务,即苗条返回列表DTOs
。实际上,性能优化通常是引入DTOs
的唯一论点。 IMO,这个因素常常被过分强调。对于在后端产生很高负载的“真实” Internet应用程序来说,这可能非常重要。对于企业系统,出于性能方面的考虑,在将“ DTOs
”广泛引入“仅”体系结构中之前,应该仔细考虑所有优缺点。也许这是不够好,以优化只是用专门的DTO和使用的域对象在全国各地的服务(尤其是CRUD服务)的前3名的搜索服务。
答案 2 :(得分:0)
恕我直言,您可以在需要时使用DTO。不管您在体系结构的哪个层上,DTO都是概念的抽象,通常在您访问服务以仅传输所需数据的表示形式时使用。将您的Dto作为合同的一部分暴露无误。为您的每个操作选择一个正确的表示形式(对于您考虑的每个退货都应有一个dto),以最大程度地减少要展示给使用者的属性数量。除非您将敏感信息作为Dto的一部分公开,否则此问题与安全无关。即使在没有合同的REST中,也需要指定一种内容类型,该类型告诉后端所需的数据表示形式。 作为服务的消费者,公开dto并没有错。 如果在数据层中看到,则应具有用于直接与数据库进行映射的实体,也许使用“名字”,“姓氏”作为列,但这是该层上的数据表示形式,在您的业务层上,也许您将这些属性表示为“ FullName” (名字+姓氏)。我的观点是,每一层都可以具有不同的数据表示形式,这没有错。您的顶层是返回或接收DTO的那一层。但是,可以使用不同的表示形式根据需要设置任意多个图层。 我看到的缺点是,每次将对象从一层转移到另一层时,都需要将所有属性映射到新的表示形式,并且该操作会影响应用程序的性能。 作为开发人员的另一个缺点是,必须了解您的体系结构才能理解每一层上的抽象(包括Dto)。如果您简化或删除层,那么根据业务逻辑,更具可读性的代码将成为您的代码。 希望这会有所帮助