ใน MVC ควรเรียก DAO จาก Controller หรือ Model


14

ฉันได้เห็นข้อโต้แย้งต่าง ๆ กับ DAO ที่ถูกเรียกจากคอนโทรลเลอร์คลาสโดยตรงและ DAO จากคลาส Model สิ่งประดิษฐ์ฉันรู้สึกว่าถ้าเราติดตาม MVC pattern ตัวควบคุมไม่ควรควบคู่กับ DAO แต่เป็น Model class ควรเรียกใช้ DAO จากภายในและผู้ควบคุมควรเรียกใช้คลาสโมเดลเพราะเราสามารถแยกคลาสโมเดลออกจากเว็บแอปพลิเคชันและแสดงฟังก์ชันการทำงานสำหรับวิธีต่างๆเช่นบริการ REST เพื่อใช้คลาสโมเดลของเรา

หากเราเขียนการร้องขอ DAO ในคอนโทรลเลอร์จะไม่สามารถใช้บริการ REST เพื่อนำฟังก์ชันการทำงานกลับมาใช้ใหม่ได้ใช่ไหม ฉันได้สรุปแนวทางทั้งสองด้านล่าง

วิธีการ # 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

วิธีการ # 2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

หมายเหตุ -

นี่คือนิยามของ Model คืออะไร:

โมเดล: โมเดลจัดการพฤติกรรมและข้อมูลของโดเมนแอ็พพลิเคชันตอบสนองต่อการร้องขอข้อมูลเกี่ยวกับสถานะของมัน (โดยปกติจะมาจากมุมมอง) และตอบสนองต่อคำแนะนำในการเปลี่ยนสถานะ (โดยปกติจากคอนโทรลเลอร์)

ในระบบที่ขับเคลื่อนด้วยเหตุการณ์นั้นโมเดลจะแจ้งผู้สังเกตการณ์ (โดยปกติจะเป็นมุมมอง) เมื่อข้อมูลมีการเปลี่ยนแปลงเพื่อให้สามารถตอบสนองได้

ฉันต้องการความเห็นจากผู้เชี่ยวชาญเกี่ยวกับเรื่องนี้เพราะฉันพบว่ามีหลายคนที่ใช้ # 1 หรือ # 2 ดังนั้นอันไหนล่ะ


1
คอนโทรลเลอร์ควรโหลดทุกอย่างจากแบบจำลองและส่งต่อไปยังมุมมอง
jgauffin

คุณแนะนำวิธีการ # 2 หรือไม่

1
"คอนโทรลเลอร์สามารถส่งคำสั่งไปยังมุมมองที่เกี่ยวข้องเพื่อเปลี่ยนการนำเสนอมุมมองของโมเดล (เช่นโดยการเลื่อนดูเอกสาร) มันสามารถส่งคำสั่งไปยังโมเดลเพื่ออัพเดตสถานะของโมเดล (เช่นแก้ไขเอกสาร)" .. emm .. มันอยู่ที่ไหนพูดว่าตัวควบคุมนั้นควรจะดึงข้อมูลหรือส่งมันไปรอบ ๆ ?
mefisto

คำตอบ:


31

ในความคิดของฉันคุณต้องแยกความแตกต่างระหว่างรูปแบบ MVC และสถาปัตยกรรม 3 ชั้น เพื่อสรุป:

สถาปัตยกรรม 3 ชั้น:

  • ข้อมูล: ข้อมูลยืนยัน;
  • บริการ: ส่วนตรรกะของแอปพลิเคชัน;
  • การนำเสนอ: hmi, เว็บเซอร์ ...

รูปแบบ MVC เกิดขึ้นในระดับการนำเสนอของสถาปัตยกรรมด้านบน (สำหรับ webapp):

  • ข้อมูล: ... ;
  • บริการ: ...;
  • ที่นำเสนอ:
    • ตัวควบคุม: ดักคำขอ HTTP และส่งกลับการตอบสนอง HTTP;
    • รุ่น: เก็บข้อมูลที่จะแสดง / รักษา;
    • view: จัดระเบียบเอาต์พุต / จอแสดงผล

วงจรชีวิตของคำขอ HTTP ทั่วไป :

  1. ผู้ใช้ส่งคำขอ HTTP;
  2. ตัวควบคุมดักมัน
  3. ตัวควบคุมเรียกบริการที่เหมาะสม
  4. บริการเรียก dao ที่เหมาะสมซึ่งส่งคืนข้อมูลที่เก็บไว้บางส่วน (ตัวอย่าง);
  5. บริการปฏิบัติต่อข้อมูลและส่งคืนข้อมูลไปยังตัวควบคุม
  6. ตัวควบคุมจัดเก็บข้อมูลในรูปแบบที่เหมาะสมและเรียกดูที่เหมาะสม;
  7. มุมมองรับอินสแตนซ์กับข้อมูลของโมเดลและกลับมาเป็นการตอบสนอง HTTP

1
สิ่งที่คุณเรียกว่า"วงจรชีวิตของคำขอ HTTP ทั่วไป"ไม่ใช่ MVC และ DAO เป็นเพียงวัตถุซึ่งอำนวยความสะดวกในการโต้ตอบ / แปลระหว่างตรรกะโดเมนและความเพียร มันเป็นไม่ได้เป็นชื่อที่แตกต่างกันสำหรับการบันทึกการใช้งาน นอกจากนี้ .. ตั้งแต่เมื่อรุ่นกลายเป็นส่วนหนึ่งของการนำเสนอแล้ว!
mefisto

1
@teresko 1) ใช่มันเป็น MVC แต่อยู่ในสถาปัตยกรรม 3 ชั้น ถ้าไม่ทำไม 2) คุณพูดถูกฉันแก้ไข 3) เนื่องจากรูปแบบ MVC ทั้งหมดเกิดขึ้นในระดับการนำเสนอ ตัวอย่างทั่วไป: Spring MVC ซึ่งเป็นรุ่นที่มีเฉพาะ Maps ที่มีคู่ค่าคีย์ SpringFuseได้เลือกตัวเลือกนี้เช่นกัน
sp00m

2
ฉันต้องเห็นด้วยกับ @ sp00m ที่นี่ ... คำอธิบายของคำขอ HTTP ทั่วไปของเขานั้นถูกต้องสำหรับเว็บแอป MVC และการวางตำแหน่งของโมเดล (เป็น 'M' ใน MVC) ซึ่งเป็นส่วนหนึ่งของเทียร์การนำเสนอก็ถูกต้องเช่นกัน . ในแอป MVC ระดับ n ระดับโดยทั่วไป 'รุ่น' จะเป็นส่วนหน้าของการนำเสนอในส่วนที่เหลือของเทียร์ด้านล่าง
Eric King เมื่อ

8

จากแบบจำลองเลเยอร์

เพื่อความแม่นยำมากขึ้น: จากบริการซึ่งมีอยู่ในโมเดลเลเยอร์เนื่องจากควบคุมการโต้ตอบระหว่างวัตถุโดเมนและนามธรรมตรรกะการจัดเก็บ

คอนโทรลเลอร์ควรรับผิดชอบในการเปลี่ยนสถานะของโมเดลเลเยอร์เท่านั้น DAO เป็นส่วนหนึ่งของกลไกการคงอยู่ สิ่งนี้ถือเป็นส่วนหนึ่งของธุรกิจโดเมนและตรรกะแอปพลิเคชัน ถ้าคุณเริ่มมีปฏิสัมพันธ์กับ DAOs ในการควบคุมคุณจะรั่วไหลตรรกะโดเมนในชั้นนำเสนอ


หากต้องการใช้เลเยอร์บริการควรเป็นรูปแบบ DDD หรือไม่ ช่วยแก้ให้ด้วยนะถ้าฉันผิด. เรามีชั้นบริการใน MVC หรือไม่?

คุณสามารถมี. บริการถูกใช้เพื่อแยกลอจิกโดเมนจากตรรกะแอปพลิเคชัน สิ่งนี้กลายเป็นสิ่งจำเป็นจากนั้นคุณย้ายจากโครงสร้างโดเมน CRUD บริสุทธิ์ (แอคทีฟเรคคอร์ด) ไปยังสิ่งที่แยกตรรกะการจัดเก็บจากตรรกะโดเมน ในเลเยอร์โมเดลที่รับรู้ได้อย่างสมบูรณ์คุณมีการแยกเชิงตรรกะ 3 แบบ: การคงอยู่โดเมนและแอปพลิเคชัน
mefisto

3

ฉันไม่แน่ใจว่ารูปแบบ MVC อย่างเป็นทางการเรียกร้องอะไร แต่โดยปกติฉันต้องการมีเลเยอร์ "บริการ" อยู่ระหว่างตัวควบคุมและ DAO ตัวควบคุมดึงข้อมูลจากคำขอและส่งไปยังคลาสบริการที่เหมาะสม คลาสบริการมีหน้าที่เรียก DAO อย่างน้อยหนึ่งรายการที่ส่งคืนคลาสโมเดล (es) คลาสโมเดลเหล่านั้นจะถูกส่งกลับไปยังคอนโทรลเลอร์เพื่อส่งไปยังเลเยอร์มุมมอง การนำเลเยอร์บริการเข้ามาช่วยในการนำมาใช้ใหม่เนื่องจากคอนโทรลเลอร์หลายตัวสามารถใช้เมธอดเลเยอร์บริการเดียวกันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.