我的业务中有2个类(托管bean),类型为X,2个类只有3个属性的相同属性,我可以让DTO包含2个bean中的所有属性,让它们扩展这个DTO或我必须在DTO中对属性进行分组并将其与2个bean相关联,以便每个bean可以设置并获取其属性,我想从设计的角度知道适当的解决方案,另一个问题是它是否正确设计托管bean和DTO直接建立关系。
答案 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,您不希望用其他可能安全的信息(如注入当前用户,上下文,会话变量等)来传递信息,以传递信息。保持简单,并在自己的位置。