Trong MVC, DAO nên được gọi từ Trình điều khiển hoặc Mô hình


14

Tôi đã thấy các đối số khác nhau chống lại DAO được gọi trực tiếp từ lớp Trình điều khiển và cả DAO từ lớp Mô hình. Cá nhân tôi cảm thấy rằng nếu chúng ta đang theo mô hình MVC, thì trình điều khiển không nên kết hợp với DAO, mà là lớp Mô hình nên gọi DAO từ bên trong và bộ điều khiển sẽ gọi lớp mô hình. Tại sao, vì chúng ta có thể tách lớp mô hình ra khỏi ứng dụng web và hiển thị các chức năng cho nhiều cách khác nhau như dịch vụ REST sử dụng lớp mô hình của chúng ta.

Nếu chúng ta viết lời gọi DAO trong bộ điều khiển, dịch vụ REST sẽ không thể sử dụng lại chức năng phải không? Tôi đã tóm tắt cả hai cách tiếp cận dưới đây.

Cách tiếp cận số 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

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

    }


 }

Cách tiếp cận số 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);

   }

}

Ghi chú -

Đây là định nghĩa của Model là gì:

Mô hình: Mô hình quản lý hành vi và dữ liệu của miền ứng dụng, trả lời các yêu cầu cung cấp thông tin về trạng thái của nó (thường là từ chế độ xem) và trả lời các hướng dẫn để thay đổi trạng thái (thường là từ bộ điều khiển).

Trong các hệ thống hướng sự kiện, mô hình thông báo cho người quan sát (thường là chế độ xem) khi thông tin thay đổi để họ có thể phản ứng.

Tôi sẽ cần một ý kiến ​​chuyên gia về điều này bởi vì tôi tìm thấy nhiều người sử dụng # 1 hoặc # 2, vậy đó là cái nào?


Bộ điều khiển nên tải mọi thứ từ mô hình và chuyển nó vào khung nhìn.
jgauffin

bạn có gợi ý cách tiếp cận # 2 không?

1
"Bộ điều khiển có thể gửi lệnh đến chế độ xem được liên kết của nó để thay đổi cách trình bày mô hình của chế độ xem (ví dụ: bằng cách cuộn qua tài liệu). Nó có thể gửi lệnh đến mô hình để cập nhật trạng thái của mô hình (ví dụ: chỉnh sửa tài liệu)." .. emm .. nó nói ở đâu, bộ điều khiển đó nên trích xuất dữ liệu hoặc chuyển nó đi khắp nơi?
mefisto

Câu trả lời:


31

Theo tôi, bạn phải phân biệt giữa mẫu MVC và kiến ​​trúc 3 tầng. Tóm lại:

Kiến trúc 3 tầng:

  • dữ liệu: dữ liệu bền vững;
  • dịch vụ: phần logic của ứng dụng;
  • thuyết trình: hmi, dịch vụ web ...

Mẫu MVC diễn ra trong lớp trình bày của kiến ​​trúc trên (đối với ứng dụng web):

  • dữ liệu: ...;
  • dịch vụ: ...;
  • trình bày:
    • bộ điều khiển: chặn yêu cầu HTTP và trả về phản hồi HTTP;
    • mô hình: lưu trữ dữ liệu sẽ được hiển thị / xử lý;
    • xem: tổ chức đầu ra / hiển thị.

Vòng đời của một yêu cầu HTTP điển hình :

  1. Người dùng gửi yêu cầu HTTP;
  2. Bộ điều khiển chặn nó;
  3. Bộ điều khiển gọi dịch vụ thích hợp;
  4. Dịch vụ gọi dao thích hợp, trả về một số dữ liệu liên tục (ví dụ);
  5. Dịch vụ xử lý dữ liệu và trả lại dữ liệu cho bộ điều khiển;
  6. Bộ điều khiển lưu trữ dữ liệu trong mô hình thích hợp và gọi chế độ xem phù hợp;
  7. Khung nhìn được khởi tạo với dữ liệu của mô hình và được trả về dưới dạng phản hồi HTTP.

Cái mà bạn gọi là "vòng đời của một yêu cầu HTTP thông thường" không phải là MVC. Và DAO chỉ là một đối tượng, tạo điều kiện cho sự tương tác / dịch thuật giữa logic miền và sự bền bỉ. Nó KHÔNG phải là một tên khác cho hồ sơ hoạt động. Ngoài ra .. kể từ khi mô hình đã trở thành một phần của bài thuyết trình?!
mefisto

1
@teresko 1) Có, đó là MVC, nhưng trong kiến ​​trúc 3 tầng. Nếu không, tại sao? 2) Bạn đã đúng, tôi chỉnh sửa. 3) Vì toàn bộ mô hình MVC diễn ra trong tầng trình bày. Ví dụ điển hình: Spring MVC, có các mô hình chỉ là Bản đồ chứa các cặp khóa-giá trị. SpringFuse cũng đã đưa ra lựa chọn này.
sp00m

2
Tôi phải đồng ý với @ sp00m ở đây ... Mô tả của anh ấy về một yêu cầu HTTP điển hình là chính xác cho một ứng dụng web MVC và việc anh ấy định vị Mô hình (như 'M' trong MVC) cũng là một phần của tầng trình bày cũng đúng . Trong các ứng dụng MVC n tầng, 'Model' thường là mặt tiền của tầng trình bày so với các tầng còn lại bên dưới.
Eric King

8

Từ lớp mô hình.

Nói chính xác hơn: từ các dịch vụ, được chứa trong lớp mô hình , bởi vì chúng chi phối sự tương tác giữa các đối tượng miền và trừu tượng logic lưu trữ.

Bộ điều khiển chỉ chịu trách nhiệm thay đổi trạng thái của lớp mô hình. DAO là một phần của cơ chế bền bỉ. Điều này tạo thành một phần của logic ứng dụng và kinh doanh tên miền. Nếu bạn bắt đầu tương tác với các DAO trong bộ điều khiển, bạn sẽ bị rò rỉ logic miền trong lớp trình bày .


Để sử dụng một lớp dịch vụ, nó phải là mẫu DDD? sửa tôi nếu tôi sai. Chúng ta có lớp dịch vụ trong MVC không?

Bạn có thể có. Các dịch vụ được sử dụng để tách logic miền khỏi logic ứng dụng. Điều này trở nên cần thiết, sau đó bạn chuyển từ cấu trúc miền CRUD thuần túy (bản ghi hoạt động) sang thứ gì đó tách logic lưu trữ khỏi logic miền. Trong lớp mô hình nhận thức đầy đủ, bạn có 3 phân tách logic: kiên trì, miền và ứng dụng.
mefisto

3

Tôi không chắc chắn mẫu MVC chính thức gọi là gì, nhưng tôi thường muốn có một lớp "dịch vụ" ở giữa bộ điều khiển và DAO. Bộ điều khiển lấy dữ liệu từ yêu cầu và chuyển nó đến lớp dịch vụ thích hợp. Lớp dịch vụ chịu trách nhiệm gọi một hoặc nhiều DAO truyền lại (các) lớp mô hình. Các lớp mô hình đó sau đó được gửi trở lại bộ điều khiển để được gửi đến lớp khung nhìn. Đưa lớp dịch vụ vào giúp tái sử dụng vì nhiều bộ điều khiển có thể sử dụng cùng các phương thức của lớp dịch vụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.