Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DTO与VM-使用还是不使用?_C#_Asp.net Mvc_Asp.net Web Api_Viewmodel_Dto - Fatal编程技术网

C# DTO与VM-使用还是不使用?

C# DTO与VM-使用还是不使用?,c#,asp.net-mvc,asp.net-web-api,viewmodel,dto,C#,Asp.net Mvc,Asp.net Web Api,Viewmodel,Dto,在asp.net(webapi+mvc)项目中,我有许多dto作为BLL的公共接口。此外,我的大多数视图模型都与相应的DTO相同 智能书告诉我们,我们必须将这类模型分开,但在这个项目上,我看不到这种解决方案的好处。只有数百个无用的代码和许多愚蠢的错误 因此,在可能的情况下,使用DTO作为视图模型是否正确?此解决方案的积极和消极影响是什么?数据传输对象只是要在逻辑和物理边界之间传输的数据的子集或超集。他们不能提供行为。它们只是数据 另一方面,视图模型是数据和行为的混合体,因为它们是给定视图的逻辑方

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

智能书告诉我们,我们必须将这类模型分开,但在这个项目上,我看不到这种解决方案的好处。只有数百个无用的代码和许多愚蠢的错误


因此,在可能的情况下,使用DTO作为视图模型是否正确?此解决方案的积极和消极影响是什么?

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

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

因为DTO和VM是覆盖不同用例的模式,所以最终可能会产生无用的数据和行为,并且可能会添加不需要的依赖项

例如,DTO可以在域层和应用层中使用。如果您同时使用在单个类中具体化的DTO和VM概念,那么最终可能会迫使域项目添加对UI库的引用以构建它。我会尽量避免这样做

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


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

感谢Matías Fidemraizer的详细回答。除此之外,我还发现了一些实际和必要的应用

在使用VM作为独立实体的情况下,您添加了额外的灵活性。最常见的情况是前端数据格式和/或结构的微小变化。第二种情况-您的VM可以从多个DTO对象合成信息,因此您可以保留bll代码而不做任何更改或最小化它们。S.O.L.I.D.就是这样。工作


但是最有用的部分是单元测试。您可以更轻松地测试bll,因为DTO对象可以简单明了。您也不应该害怕映射错误。

DTO
作为基类怎么样?简单地将VM转换为基类会产生DTO(无需复制任何内容)。@Sinatr因为我是ortodox,所以我不想让下面的陈述成为事实:
if(VM是DTO)
:\
public class Base {}

public class Dto : Base {}
public class ViewModel : Base {}