托管bean可以扩展DTO

时间:2013-05-11 09:00:05

标签: jsf design-patterns jsf-2 associations ooad

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

1 个答案:

答案 0 :(得分: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 {   }
}

在这种情况下,所有逻辑都非常清晰。此外,您不需要编写'extras',因为所有属性都可以在EL上下文中使用,并具有其他访问者。您的对象的生命周期是可预测的并且格式良好。


最终,DTO是一个DTO,您不希望用其他可能安全的信息(如注入当前用户,上下文,会话变量等)来传递信息,以传递信息。保持简单,并在自己的位置。