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 方法,而是在 C
和 M
之间有一个层来执行 *requests
和 *requestModels
类之间的转换。
-
所有必要的转换(字符串到整数,短)
请求中空字段的默认值
执行一些检查是否存在实体 ID。
构建模型层所需的新字段。
这已经是一种设计模式了吗? 有更好的方法吗?
主要思想是使用EntityFilterRequestModel
类从模型中删除上述所有验证,并减少M
层上不必要的代码。
如果您需要更多详细信息,请添加 cmets,我会尽量说得更清楚。
【问题讨论】:
MVC 不会将控制器中的层数限制为一层,因此您还没有做任何非 MVC 的事情。让数据适合模型层一直是控制器的责任。 好的,我同意你的观点,但是有没有更好的方法来实现我想要做的事情?有这方面的现有设计模式吗? 有很多库可以为您进行映射,例如 Dozer。没有将一个对象转换为另一个对象的设计模式。 我不认为推土机正是我需要的,因为我做的不仅仅是EntityFilterRequest
和EntityFilterRequestModel
之间的映射。我执行问题上列出的 4 点。关于这个“新”层,我可以称它为变换/映射层吗?
【参考方案1】:
首先,正如 Kayaman 所说,我真的不认为您正在向 MVC 添加额外的层(好的,您可以将其视为 MVC 组件之一的“子层”)。
您的意图是将请求数据转换/映射为适合传递给模型的数据结构。基本上,您需要将一种结构映射到另一种结构,并将发送方请求与其接收方分离。
但是,在我看来,你给一个对象增加了很多责任。转换器做的事情太多了。所以你可以做的是:
控制器将EntityFilterRequest
-> EntityFilterModel
转换委托给特定对象(例如映射器):
requestMapper.map(EntityFilterRequest);
。这个映射器可以处理强制转换和默认值。它的职责是将请求转换为适合传递给模型的已知 DataStructure (EntityFilterModel
);
获得EntityFilterModel
后,您可以将其传递给Validator
,甚至可以传递给可以存储多个Validators
的ValidatorChain
,当然还可以处理多个验证;
在所有验证都到位后,如果所有验证都有效,则可以将 EntityFilterModel
传递给模型本身以进行进一步处理;
这样,您就创建了一组相互正交的可重用和解耦组件。例如,验证器可以在其他一些上下文中使用。
该过程涉及更多的一组设计模式,而不仅仅是一个。事实上,一个问题的解决方案通常需要几个设计合作伙伴一起工作。不过,请看以下内容: https://sourcemaking.com/design_patterns/chain_of_responsibility
希望对你有帮助!
【讨论】:
我已经尝试了链式设计模式验证的方法,但是实施起来太耗时了。我有时间限制来实现这个新层。但是非常感谢您的意见。以上是关于MVC - 使用哪种设计模式将请求有效负载从控制器转换为模型的主要内容,如果未能解决你的问题,请参考以下文章
从具有多个参数 net core mvc 的控制器调用另一个 actionresult