控制器和外观之间的通信,转换请求=> dto

问题描述 投票:0回答:1

好吧,我将我的Web应用程序分成了模块。每个模块都通过Facade与其他模块通信,这是唯一的入口点。控制器也通过外观与模块通信。

外观中的方法采用一些DTO并做一些业务逻辑。

在90%的情况下请求来到控制器映射1-1 facade方法的DTO参数。

我的问题是:使用相同的类在控制器中获取请求然后在外观中使用DTO是一种好习惯吗?

java architecture domain-driven-design
1个回答
1
投票

我不会说这是一种绝对正确的方法。

例如,如果您的应用程序非常简单,只需要用于创建和获取数据的数据库操作,简单的数据模型以及没有复杂的业务逻辑,那么使用相同的DTO可能会很好。这种情况大多不正确。

但是,如果您的应用程序需要处理大量业务“用例”,那么将核心域层对象与用于与外部系统(如API或消息队列)交互的对象分开是一种很好的做法。

如果你举一个例子(一个有点人为的用例来说明我正在提出的观点):

假设用户现在可以通过ReST端点在您的应用程序中创建客户,并且有一个定义明确的请求模型:

class CustomerDTO {
  private String firstName;
  private String lastName;
  private String companyId;
  private String email;
  private List<String> subscriptions; // customers subscribe to services
}

假设您的域名模型:

class CustomerBO {
  private String name;   // firstName + lastName
  private String companyId;
  private String email;
  private List<String> subscriptions; // customers subscribe to services
}

稍后,如果您想通过从消息队列或CSV文件中读取实体来添加创建实体的功能 - 您的应用程序可能是下游系统从另一个应用程序获取提要。在这种情况下,您与API用例有以下区别:

  • 每个客户只有1个订阅(总是)
  • name作为单个字段发送
  • 没有电子邮件,因为这些客户不是真正的人类用户(也就是说没有要发送的电子邮件,没有登录等)

因此,您的请求模型如下所示:

class FeedCustomerDTO {
  private String name;
  private String companyId;
  private String subscriptionId;
}

现在,应用程序核心只接受CustomerBO。 API和Feed模块将请求模型转换为一致的域模型。您可以看到,在这两个用例中使用一致的CustomerBO可以帮助您保持应用程序核心清洁并与交互分离。

希望这有意义,并解决您的查询。

© www.soinside.com 2019 - 2024. All rights reserved.