MVC - 使用哪种设计模式将请求有效负载从控制器转换为模型

Posted

技术标签:

【中文标题】MVC - 使用哪种设计模式将请求有效负载从控制器转换为模型【英文标题】:MVC - Which design pattern to use to transform request payload from the Controller to the Model 【发布时间】:2016-02-04 18:11:48 【问题描述】:

我正在使用 MVC 方法。

因此,当我从 PUT/POST 动词的主体(有效负载)收到 EntityFilterRequest 时,我需要将 EntityFilterRequest 转换为 EntityFilterRequestModel 使用

EntityFilterRequestModel.of(EntityFilterRequest).

of 方法执行:

所以基本上我没有使用传统的 MVC 方法,而是在 CM 之间有一个层来执行 *requests*requestModels 类之间的转换。

    所有必要的转换(字符串到整数,短) 请求中空字段的默认值 执行一些检查是否存在实体 ID。 构建模型层所需的新字段。

这已经是一种设计模式了吗? 有更好的方法吗?

主要思想是使用EntityFilterRequestModel 类从模型中删除上述所有验证,并减少M 层上不必要的代码。

如果您需要更多详细信息,请添加 cmets,我会尽量说得更清楚。

【问题讨论】:

MVC 不会将控制器中的层数限制为一层,因此您还没有做任何非 MVC 的事情。让数据适合模型层一直是控制器的责任。 好的,我同意你的观点,但是有没有更好的方法来实现我想要做的事情?有这方面的现有设计模式吗? 有很多库可以为您进行映射,例如 Dozer。没有将一个对象转换为另一个对象的设计模式。 我不认为推土机正是我需要的,因为我做的不仅仅是EntityFilterRequestEntityFilterRequestModel 之间的映射。我执行问题上列出的 4 点。关于这个“新”层,我可以称它为变换/映射层吗? 【参考方案1】:

首先,正如 Kayaman 所说,我真的不认为您正在向 MVC 添加额外的层(好的,您可以将其视为 MVC 组件之一的“子层”)。

您的意图是将请求数据转换/映射为适合传递给模型的数据结构。基本上,您需要将一种结构映射到另一种结构,并将发送方请求与其接收方分离。

但是,在我看来,你给一个对象增加了很多责任。转换器做的事情太多了。所以你可以做的是:

控制器将EntityFilterRequest -> EntityFilterModel 转换委托给特定对象(例如映射器): requestMapper.map(EntityFilterRequest);。这个映射器可以处理强制转换和默认值。它的职责是将请求转换为适合传递给模型的已知 DataStructure (EntityFilterModel); 获得EntityFilterModel 后,您可以将其传递给Validator,甚至可以传递给可以存储多个ValidatorsValidatorChain,当然还可以处理多个验证; 在所有验证都到位后,如果所有验证都有效,则可以将 EntityFilterModel 传递给模型本身以进行进一步处理;

这样,您就创建了一组相互正交的可重用和解耦组件。例如,验证器可以在其他一些上下文中使用。

该过程涉及更多的一组设计模式,而不仅仅是一个。事实上,一个问题的解决方案通常需要几个设计合作伙伴一起工作。不过,请看以下内容: https://sourcemaking.com/design_patterns/chain_of_responsibility

希望对你有帮助!

【讨论】:

我已经尝试了链式设计模式验证的方法,但是实施起来太耗时了。我有时间限制来实现这个新层。但是非常感谢您的意见。

以上是关于MVC - 使用哪种设计模式将请求有效负载从控制器转换为模型的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 实践 - Base

使用mvc模式设计的web应用程序具有以下优点,除了?

使用 ajax 以 mvc 模式通过控制器发送数据

从具有多个参数 net core mvc 的控制器调用另一个 actionresult

如何从命令行使用 JSON 有效负载进行 HTTP 请求/调用?

从控制器事件(无客户端请求)向视图发送数据 ASP.NET MVC 4