视图模型和请求-响应消息传递模式之间的MVC映射

托马斯·韦尔

我遇到以下MVC设计模式问题,并且困惑该走哪条路。

在UI层中,控制器操作方法中使用了视图模型。凉爽的。

服务层使用请求-响应消息模式,因此服务类方法将请求对象作为参数(输入),并且该方法返回响应对象(输出)。此方法调用带有Domain对象参数的Repository方法。换句话说,要调用service方法,需要用数据填充Request对象,然后该方法在Response对象中返回结果,即请求-响应消息传递。

要将视图模型中的数据传递给Service方法中的Domain对象,您有两个选项AFAIK:

  1. 确保“请求”对象包含与“视图模型”属性相同的属性,然后可以(手动或自动)将值从“视图模型”映射到“请求”对象。
  2. Request对象包含View模型的一个属性,即View Model的实例现在位于Request对象中(与上述选项不同-只有一个属性)。现在,您可以简单地将视图模型分配给Request对象中的属性。

我发现这两种方法都有缺陷...

在选项1中,如果视图模型具有许多属性,并且您正在使用映射器(例如AutoMapper),则需要在Controller方法中将属性从视图模型自动映射到Request对象。然后在Service层的service方法中,您需要将Request对象中的属性自动映射到Domain对象。两个级别的映射-非常错误!

在选项2中,请求对象包含一个包含视图模型的属性。然后,您可以轻松高效地将Request.vm(属性)自动映射到Domain对象,但是出于某种原因,这对我来说似乎是糟糕的设计!我担心这种设计。

哪种方法最好?还是在VM和RR模式之间映射还有另一种更好的方法?

埃里克·冯肯布施(Erik Funkenbusch)

请求/响应是一种消息传递模式,但是您似乎没有使用消息。而是使用了对象。这是您问题的真正症结所在。您使用的模式不正确,更重要的是,您似乎在为作业使用了错误的模式。为什么在这种情况下需要消息传递?对于简单的多层应用程序来说,这只是额外的开销。

如果您确实想使用消息传递,则可能应该将数据序列化为json或xml,将其传递给服务,然后将数据反序列化为该层中使用的任何对象。这样,您不需要对另一层的数据类型有任何依赖性,因为(反序列化)过程不一定需要此类依赖性。

就个人而言,我会避免整个消息传递方面,而是拥有一个在视图模型和域对象之间进行映射的映射层,然后使用域对象调用服务层。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在视图模型之间传递消息

MVC模式。模型,视图和控制器之间的关系

春季模型与模型和视图之间的区别

AutoMapper:域模型和视图模型之间的双向深度映射

重构视图模型和视图之间的xaml映射

我应该使用哪种消息传递模式来处理和返回来自REST请求的响应?

Java MVC游戏中的视图和模型

MVC视图模型和linq查询

在发布请求之间保留复杂的视图模型数据

如何使用自动映射器在模型和视图模型之间映射父子关系船

在域模型和视图模型之间共享逻辑的正确方法

MVC编辑和发送带有部分视图的模型视图

创建新模型和视图或将模型作为方法参数传递之间有什么区别

通过notifychanged或command属性在父视图模型和子视图模型之间进行通信?

在Rails show视图中映射和链接模型实例

将视图和表映射到EF中的相同模型?

将分页添加到包含部分视图和视图模型的视图(Razor、MVC)

模型,视图和控制器之间的Ruby on Rails关系

xamarin 中行为和视图模型之间的通信

在角度视图和模型之间添加其他逻辑

如何以角度处理视图和模型之间的输入数据

具有加载和表单模型的MVC视图

ASP.NET MVC路由值和视图模型

jQuery UI Datepicker和MVC视图模型类型datetime

DropDownList和视图模型的MVC5问题

MVC PRG模式-传递模型

使用强类型模型在控制器和视图之间传递数据

ASP.NET MVC-正确使用视图模型和命令模式

如何将倍数和选择性模型传递到MVC剃刀局部视图中?