【问题标题】:Can a managed bean extends a DTO托管 bean 可以扩展 DTO
【发布时间】:2013-05-05 22:02:31
【问题描述】:
我的业务中有 2 个类型 X 的类(托管 bean),这 2 个类仅具有相同的属性,除了 3 个属性,我可以让 DTO 包含 2 个 bean 中的所有属性并让它们扩展这个DTO 或者我必须对 DTO 中的属性进行分组并将其与 2 个 bean 相关联,以便每个 bean 都可以设置和获取其属性,我想从设计的角度了解适当的解决方案,另一个问题是它的正确设计托管 bean 和 DTO 直接建立关系。
【问题讨论】:
标签:
jsf
design-patterns
jsf-2
associations
ooad
【解决方案1】:
你可以这样做,但它很容易出错,违反了 MVC 范式,就我而言,这只是一种糟糕的做法。
考虑并比较两个简单的案例。第一种情况是扩展 DTO 的 bean,第二种情况是 包含 DTO 的 bean。
扩展 DTO 的托管 bean
public class ContactDto {
private String name;
}
public class ContactBean extends ContactDto {
//has name inherited
private boolean renderedAdminPanel;
public void action { }
}
在这种情况下,谁将生产托管 bean?它们何时被实例化以及如何被实例化?你的 DAO 会与ContacyBean 紧密耦合吗?如果您决定放弃使用 DTO 并改用分离实体怎么办?
所有这些都会增加您架构中的差异,并至少使其难以管理。
现在让我们考虑另一种方法。
包含 DTO 的托管 bean
public class ContactBean {
private ContactDto contactDto;//all fields contained inside
@PostConstruct
public void init() {
//get data from your service based on injected parameter's value and assign it to your DTO
}
private boolean renderedAdminPanel;
public void action { }
}
在这种情况下,所有逻辑都非常清晰。此外,您不需要编写“附加”,因为您的所有属性都可以在 EL 上下文中使用附加访问器。您的对象的生命周期是可预测且格式正确的。
最终,DTO 就是一个 DTO,您不希望使用其他可能安全的信息来增加它的趣味性,例如注入的当前用户、上下文、会话变量等来传递这些信息。保持简单并在自己的位置。