视图模型和请求-响应消息传递模式之间的 MVC 映射
MVC Mapping between View Model and Request-Response messaging pattern
我有以下 MVC 设计模式问题,不知道该走哪条路。
在UI层中,View Model用于Controller动作方法。酷
Service层使用Request-Response消息模式,所以serviceclass方法有一个Request对象作为参数(in),方法returns有一个Response对象(out) .此方法使用 Domain 对象参数调用 Repository 方法。换句话说,要调用服务方法,您需要用您的数据填充 Request 对象,方法 returns 产生 Response 对象,即请求-响应消息传递。
要将视图模型中的数据传递到服务方法中的域对象,您有两种选择 AFAIK:
- 确保请求对象包含与视图模型属性相同的属性,然后您可以(手动或自动)将值从视图模型映射到请求对象。
- Request 对象包含视图模型的 属性,即视图模型的实例现在存在于 Request 对象中(与上述选项不同 - 只有一个 属性)。现在您可以简单地将视图模型分配给请求对象中的 属性。
我发现这两种方法都有缺陷...
在选项 1 中,如果 View Model 有很多属性,并且您正在使用映射器(例如 AutoMapper),则在 Controller 方法中,您需要将 View Model 的属性自动映射到 Request 对象。然后在服务层,在服务方法中,您需要将 Request 对象中的属性自动映射到 Domain 对象。两级映射 - 非常错误!
在选项 2 中,请求对象包含一个包含视图模型的 属性。然后,您可以轻松高效地将 Request.vm (属性) 自动映射到 Domain 对象,但出于某种原因,这对我来说看起来像是糟糕的设计!我很关心这个设计。
哪种方法最好?或者是否有另一种更好的方法来映射 VM 和 R-R 模式?
在你上面描述的场景中,我没有 Request 对象。
我只是使用来自服务层 -> 表示层的域对象 (POCO classes/entity)。
在准备来自控制器的响应时,我使用 AutoMapper 将从服务层返回的域对象转换为 ViewModel 对象。
通过上面的方法,正如你所看到的,选项1就完全没有问题了。域到 VM 的配置,反之亦然,只需一次即可完成。
当 Web 请求传入时,它有一个 ViewModel 对象,该对象在传递到服务层之前转换回域模型。
我不确定您是否可以将其视为 "another" 或 "better" 模式。如果您觉得这个想法不错,我可以根据需要提供更多信息。
Request/Response 是一个 messaging 模式,但您似乎没有使用消息……而是使用了对象。这是你问题的真正症结所在。您使用的模式不正确,更重要的是,您似乎在工作中使用了错误的模式。为什么在这种情况下需要消息传递?对于一个简单的多层应用程序来说,这只是额外的开销。
如果您真的想使用消息传递,您应该将数据序列化为 json 或 xml,将其传递给您的服务,然后将数据反序列化为您在其中使用的任何对象层。这样,你就不需要对其他层的数据类型有任何依赖,因为(反)序列化过程不一定需要这样的依赖。
就个人而言,我会避免整个消息传递方面,并有一个映射层在您的视图模型和您的域对象之间进行映射,然后使用域对象调用您的服务层。
我有以下 MVC 设计模式问题,不知道该走哪条路。
在UI层中,View Model用于Controller动作方法。酷
Service层使用Request-Response消息模式,所以serviceclass方法有一个Request对象作为参数(in),方法returns有一个Response对象(out) .此方法使用 Domain 对象参数调用 Repository 方法。换句话说,要调用服务方法,您需要用您的数据填充 Request 对象,方法 returns 产生 Response 对象,即请求-响应消息传递。
要将视图模型中的数据传递到服务方法中的域对象,您有两种选择 AFAIK:
- 确保请求对象包含与视图模型属性相同的属性,然后您可以(手动或自动)将值从视图模型映射到请求对象。
- Request 对象包含视图模型的 属性,即视图模型的实例现在存在于 Request 对象中(与上述选项不同 - 只有一个 属性)。现在您可以简单地将视图模型分配给请求对象中的 属性。
我发现这两种方法都有缺陷...
在选项 1 中,如果 View Model 有很多属性,并且您正在使用映射器(例如 AutoMapper),则在 Controller 方法中,您需要将 View Model 的属性自动映射到 Request 对象。然后在服务层,在服务方法中,您需要将 Request 对象中的属性自动映射到 Domain 对象。两级映射 - 非常错误!
在选项 2 中,请求对象包含一个包含视图模型的 属性。然后,您可以轻松高效地将 Request.vm (属性) 自动映射到 Domain 对象,但出于某种原因,这对我来说看起来像是糟糕的设计!我很关心这个设计。
哪种方法最好?或者是否有另一种更好的方法来映射 VM 和 R-R 模式?
在你上面描述的场景中,我没有 Request 对象。
我只是使用来自服务层 -> 表示层的域对象 (POCO classes/entity)。
在准备来自控制器的响应时,我使用 AutoMapper 将从服务层返回的域对象转换为 ViewModel 对象。
通过上面的方法,正如你所看到的,选项1就完全没有问题了。域到 VM 的配置,反之亦然,只需一次即可完成。
当 Web 请求传入时,它有一个 ViewModel 对象,该对象在传递到服务层之前转换回域模型。
我不确定您是否可以将其视为 "another" 或 "better" 模式。如果您觉得这个想法不错,我可以根据需要提供更多信息。
Request/Response 是一个 messaging 模式,但您似乎没有使用消息……而是使用了对象。这是你问题的真正症结所在。您使用的模式不正确,更重要的是,您似乎在工作中使用了错误的模式。为什么在这种情况下需要消息传递?对于一个简单的多层应用程序来说,这只是额外的开销。
如果您真的想使用消息传递,您应该将数据序列化为 json 或 xml,将其传递给您的服务,然后将数据反序列化为您在其中使用的任何对象层。这样,你就不需要对其他层的数据类型有任何依赖,因为(反)序列化过程不一定需要这样的依赖。
就个人而言,我会避免整个消息传递方面,并有一个映射层在您的视图模型和您的域对象之间进行映射,然后使用域对象调用您的服务层。