首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制器层应该创建模型对象还是由服务层创建?

控制器层应该创建模型对象还是由服务层创建?
EN

Software Engineering用户
提问于 2016-02-28 00:16:08
回答 2查看 5.6K关注 0票数 5

我有一个小应用程序的经典层控制器-服务-Dao。控制器实际上是REST资源,它处理JSON数据。问题是: 1.从JSON原语创建业务对象的最佳位置在哪里?控制还是服务?控制器应该将原语从JSON传递到服务方法吗? 2.如果应该在控制器层中创建对象,那么传递服务方法原语值是否具有良好的风格,如果它是一种id搜索方法?

更新1.我指的是java:

代码语言:javascript
运行
复制
serviceSearchMethod(int value1, String value2);

vs

代码语言:javascript
运行
复制
SomeObject someObject = new SomeObject(int value1, String value2);
serviceSearchMethod(someObject);

当然,someObject可以包含10个字段,但是控制器只有2个值,所以在这种情况下,它是好的创建业务对象( BO ),还是只适用于如果我可以创建BO,这不仅是DTO的服务层,而是一些有价值的东西,从业务的角度来看?

EN

回答 2

Software Engineering用户

发布于 2016-02-28 04:12:35

我更喜欢尽快将JSON转换为业务对象,这通常是在REST控制器类中完成的。这是有原因的:

  • JSON是一种数据传输格式。在大型系统中,很可能有其他数据传输格式(例如XML或CSV)。因此,如果可能的话,您的内部表示应该与数据格式无关。
  • 业务对象通常有行为方法。如果数据仍然是JSON格式,那么编写行为方法祝您好运:)
  • 在大多数系统中,对象是在代码中创建的,也是在连接上创建的。创建JSON对象而不是Java是很奇怪的。

但有一点需要注意--我的经验是使用Java服务。如果您正在运行服务器端Javascript框架,则可能需要考虑其他事项。

票数 7
EN

Software Engineering用户

发布于 2016-02-28 11:53:29

我使用了许多这样的系统(构建于PHP,而不是Java,但这是相同的原则),我同意@kiwiron的观点:最好在Controller层中这样做。

以下是我建议这样做的几个理由:

  • 控制器层充当您系统内外的一个网关,一个与外部世界的通信器.由于JSON是用于与外部通信的格式,因此对该格式进行编码/解码的责任应该在该层的某个位置。
  • REST系统(您刚才提到的)在99.99%的情况下使用HTTP协议进行传输。这意味着您可以并且很好地使用AcceptContent-Type headers来协商进出系统的内容(这很好,因为您可以方便地同时支持多种格式)。由于您的服务层和DAO层应该完全不了解与外部世界的通信,所以在Controller层中应该负责确定客户机/调用者提供和请求的内容(使用那些HTTP报头)。

然而,有一个小问题,在许多这样的系统中,这可能是一个常见的情况:如果您有3个依赖于相同服务的控制器(来自服务层),该怎么办?上面描述的最佳实践是让控制器创建模型/实体对象.但如果他们都这么做,那么我们就不会有这么严重的违反干燥原则。

因此,这是我的建议:

  • 对于每个模型/实体对象,有某种工厂或生成器,将其从解码格式(可能是数组)中转换出来。变成物体。这样,转换只在一个位置。
  • 使用控制器层中的工厂/构建器
  • 使服务层和DAO层仅与对象一起工作。
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/311284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档