gpt4 book ai didi

java - 不同 MVC 层之间的数据流

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:01 24 4
gpt4 key购买 nike

下面我展示了从使用表单到持久层的数据流。但是对哪些对象应该在MVC的哪一层可用以及数据应该如何在MVC的不同层之间传递存在疑问。我正在使用 Spring,所以下面发布的代码是 Spring 框架的代码。

我们开始吧,我有一个 DTO(数据传输对象)PatientForm,它保存用户输入的表单数据。

public class Patient {

private int id;
private String name;
private String medicineOne;
private String medicineTwo;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMedicineOne() {
return medicineOne;
}
public void setMedicineOne(String medicineOne) {
this.medicineOne = medicineOne;
}
public String getMedicineTwo() {
return medicineTwo;
}
public void setMedicineTwo(String medicineTwo) {
this.medicineTwo = medicineTwo;
}
}

PatientForm 被传递给一个 Controller PatientController,不传输数据但将表单传递给服务层PatientService

@PostMapping("/patient/addpatient")
public ModelAndView addPatient(@ModelAttribute("patientform") PatientForm patient){
patientService.addPatient(patient);
return new ModelAndView("redirect:/");
}

在服务层 PatientService 中,发生从 DTO 到持久实体 Patient 的实际数据传输。

public void addPatient(com.hp.view.form.PatientForm patientForm){
String medicineOneName = patientForm.getMedicineOne();
Medicine medicineOne = medicineService.findByName(medicineOneName);
if(medicineOne == null){
medicineService.save(new Medicine(medicineOneName));
medicineOne = medicineService.findByName(medicineOneName);
}

String medicineTwoName = patientForm.getMedicineTwo();
Medicine medicineTwo = medicineService.findByName(medicineTwoName);
if(medicineTwo == null){
medicineService.save(new Medicine(medicineTwoName));
medicineTwo = medicineService.findByName(medicineTwoName);
}

List<Medicine> medicines = new ArrayList<>();
medicines.add(medicineOne);
medicines.add(medicineTwo);

Patient patient = new Patient();
patient.setName(patientForm.getName());
patient.setMedicine(medicines);
patientRepository.save(patient);
}

根据上面的流程,这是我的问题:

  1. Controller 层 还是 Service 层 应该将数据从 DTO 传输到 Persistent Entity?

  2. 如果数据传输在 Controller 中完成,则意味着模型实体将在 Controller 层中声明。如果数据传输在服务层完成意味着 DTO 将在服务层声明。两者哪个更好?

  3. 在我的服务层中,我实例化了实体对象 Patient 的实例。这会产生问题吗?我应该让 Spring Contianer 管理我的实体 bean?

  Patient patient = new Patient();

最佳答案

(1) Should Controller layer or Service layer transfer data from DTO to Persistent Entity?

FormBean 是特定于客户端/ channel /端点的,因此 Controller 层应该执行特定于客户端的验证(例如最小长度、最大长度等),然后将 FormBean 的数据转换为实体 Bean,实体 Bean 将传递给服务层。在 3 层架构中,服务层应该是可重用的(下面解释),它不应该知道 FormBeans,因此接收实体对象并应该负责处理业务逻辑(执行业务验证和核心逻辑以及与 DAO/Repository 类交互) ).

(2) If data transfer is done in controller means model entity will be declared in controller layer. And if data transfer is done in service layer means DTO will be declared in service layer. Which of the two is prefered?

可以重用/公开单个服务以连接多个端点,例如 Controller 或不同的 Web 服务,并且每个端点可能需要不同的 formbeans,因此 Controller (端点)层更适合处理端点特定的验证和然后创建/将正确的实体对象传递给服务。

(3) In my service layer I have instantiated instance of my entity object Patient. Will this create problem and I should let Spring container manage my entity beans?

没问题。由于实体对象不是单例,您可以像之前那样在服务中创建它们。但是,如果您允许 Spring 管理它们,则需要确保为每个输入请求创建一个实例。这是因为Spring bean的default scopesingleton,需要改成request scope。

关于java - 不同 MVC 层之间的数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com