0

我的业务中有 2 个类型 X 的类(托管 bean),这 2 个类仅具有相同的属性,除了 3 个属性,我可以让 DTO 包含 2 个 bean 中的所有属性并让它们扩展这个 DTO 或者我必须对 DTO 中的属性进行分组并将其与 2 个 bean 相关联,以便每个 bean 都可以设置和获取其属性,我想从设计的角度了解适当的解决方案,另一个问题是托管 bean 的正确设计和 DTO 直接有关系。

4

1 回答 1

0

你可以这样做,但这很容易出错,违反了 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,您不希望使用其他可能安全的信息来为它增添趣味,例如注入的当前用户、上下文、会话变量等以传递该信息。保持简单并在自己的位置。

于 2013-05-11T14:08:46.637 回答