好吧,我将Web应用程序划分为模块。每个模块都通过Facade与其他模块通信,这是唯一的入口点。控制器还通过立面与模块进行通信。
facade中的方法需要一些DTO并执行一些业务逻辑。
在90%的情况下,对控制器映射1-1外观方法的DTO参数的请求。
我的问题是:在控制器中使用相同的类来获取请求,然后在外观中用作DTO是一种好习惯吗?
答案 0 :(得分: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用例有以下区别:
因此,您的请求模型如下所示:
class FeedCustomerDTO {
private String name;
private String companyId;
private String subscriptionId;
}
现在,应用程序核心仅接受CustomerBO
。 API和Feed模块将请求模型转换为一致的域模型。您可以看到,在这两个用例中保持一致的CustomerBO
可以帮助您保持应用程序核心的清洁度并使其与交互脱钩。
希望这很有意义并解决您的查询。