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

我正在使用 MVC 方法。

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

EntityFilterRequestModel.of(EntityFilterRequest).

of 方法执行:

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

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

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

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

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

【问题讨论】:

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

标签: java rest spring-mvc design-patterns model-view-controller


【解决方案1】:

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

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

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

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

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

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

希望对你有帮助!

【讨论】:

  • 我已经尝试了链式设计模式验证的方法,但是实施起来太耗时了。我有时间限制来实现这个新层。但是非常感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多