DTO vs VM - 使用还是不使用?

tmt*_*tmt 4 c# asp.net-mvc dto viewmodel asp.net-web-api

在 asp.net (webapi+mvc) 项目中,我有许多 dto 作为我的 BLL 的公共接口。此外,我的大多数视图模型都与适当的 dtos 相同。

聪明的书告诉我们,我们必须分离这种模型,但在项目中我看不到这种解决方案的好处。只有数百个无用的代码,其中包含许多愚蠢的错误。

那么 - 在可能的情况下使用 DTO 作为视图模型是否正确?该解决方案的正面和负面影响是什么?

Mat*_*zer 5

数据传输对象只是要在逻辑和物理边界之间传输的数据的子集或超集。他们不能提供行为。它们只是数据。

另一方面,视图模型是数据和行为的混合体,因为它们是给定视图的逻辑方面。

由于 DTO 和 VM 是涵盖不同用例的模式,因此您最终可能会得到无用的数据和行为,并且可以添加不需要的依赖项。

例如,DTO 可用于域和应用程序层。如果您在单个类中同时使用 DTO 和 VM 概念,则最终可能会强制域项目添加对 UI 库的引用,以便能够构建它。我会尽可能避免这种情况。

此外,您知道有一个面向对象的概念称为继承,它可以帮助您保持 DRY(不要重复自己):

public class Base {}

public class Dto : Base {}
public class ViewModel : Base {} 
Run Code Online (Sandbox Code Playgroud)

总之,您可以通过继承共享 DTO 和视图模型的共同点,并避免代码重复。