Nắm tay của tất cả:
Tôi tin rằng bạn đang trộn lẫn nguyên tắc thiết kế dựa trên nền tảng MVC và n-tier.
Sử dụng cách tiếp cận MVC không có nghĩa là bạn không nên lớp ứng dụng của mình.
Nó có thể hữu ích nếu bạn thấy MVC giống như một phần mở rộng của lớp trình bày.
Nếu bạn đặt mã không trình bày bên trong mẫu MVC, bạn có thể sẽ sớm xuất hiện trong một thiết kế phức tạp.
Vì vậy, tôi khuyên bạn nên đặt logic nghiệp vụ của mình vào một lớp kinh doanh riêng biệt.
Chỉ cần có một cái nhìn lúc này: Wikipedia article about multitier architecture
Nó nói:
Hôm nay, MVC và tương tự như model-view-người dẫn chương trình (MVP) là Tách mẫu Mối quan tâm thiết kế được áp dụng riêng cho các lớp trình bày của một hệ thống lớn hơn.
Dù sao ... khi nói về một ứng dụng web doanh nghiệp các cuộc gọi từ UI đến lớp logic kinh doanh nên được đặt bên trong (trình bày) điều khiển.
Đó là do bộ điều khiển thực sự xử lý các cuộc gọi đến một tài nguyên cụ thể, truy vấn dữ liệu bằng cách thực hiện cuộc gọi đến logic nghiệp vụ và liên kết dữ liệu (mô hình) với chế độ xem phù hợp.
Bùn nói với bạn rằng các quy tắc kinh doanh đi vào mô hình.
Điều đó cũng đúng, nhưng ông đã trộn lẫn mô hình (bản trình bày) ('M' trong MVC) và mô hình lớp dữ liệu của thiết kế ứng dụng dựa trên tầng.
Vì vậy, nó là hợp lệ để đặt doanh nghiệp liên quan đến cơ sở dữ liệu của bạn quy tắc trong mô hình (lớp dữ liệu) của ứng dụng của bạn.
Nhưng bạn không nên đặt chúng trong mô hình của lớp trình bày có cấu trúc MVC vì điều này chỉ áp dụng cho một giao diện người dùng cụ thể.
Kỹ thuật này độc lập với thời tiết, bạn sử dụng thiết kế hướng theo miền hoặc phương pháp tiếp cận dựa trên tập lệnh giao dịch.
Hãy để tôi hình dung đó cho bạn: lớp
Trình bày: Model - View - Controller
lớp kinh doanh: Miền logic - Ứng dụng Logic
Lớp dữ liệu: Kho dữ liệu - Lớp truy cập dữ liệu
Mô hình mà bạn thấy ở trên có nghĩa là bạn có ứng dụng sử dụng MVC, DDD và lớp dữ liệu riêng biệt cơ sở dữ liệu.
Đây là phương pháp phổ biến để thiết kế ứng dụng web doanh nghiệp lớn hơn.
Nhưng bạn cũng có thể thu nhỏ nó xuống để sử dụng một lớp kinh doanh không DDD đơn giản (một lớp nghiệp vụ không có logic miền) và một lớp dữ liệu đơn giản ghi trực tiếp vào cơ sở dữ liệu cụ thể.
Bạn thậm chí có thể thả toàn bộ lớp dữ liệu và truy cập cơ sở dữ liệu trực tiếp từ lớp nghiệp vụ, mặc dù tôi không khuyên bạn nên.
Thats' lừa ... Tôi hy vọng điều này sẽ giúp ...
[Lưu ý:] Bạn cũng nên nhận thức được thực tế là hiện nay có nhiều hơn chỉ là một 'mô hình' trong một ứng dụng. Thông thường, mỗi lớp của một ứng dụng có mô hình riêng của nó. Mô hình của lớp trình bày được xem cụ thể nhưng thường độc lập với các điều khiển được sử dụng. Lớp nghiệp vụ cũng có thể có một mô hình, được gọi là "mô hình miền". Đây thường là trường hợp khi bạn quyết định sử dụng phương pháp tiếp cận theo miền. "Mô hình miền" này chứa dữ liệu cũng như logic nghiệp vụ (logic chính của chương trình của bạn) và thường độc lập với lớp trình bày. Lớp trình bày thường gọi lớp doanh nghiệp trên một "sự kiện" nhất định (nút được nhấn vv) để đọc dữ liệu từ hoặc ghi dữ liệu vào lớp dữ liệu. Lớp dữ liệu cũng có thể có mô hình riêng của nó, thường là cơ sở dữ liệu liên quan. Nó thường chứa một tập các lớp thực thể cũng như các đối tượng truy cập dữ liệu (DAO).
Câu hỏi đặt ra là: điều này phù hợp với khái niệm MVC như thế nào?
Trả lời -> Không!
Vâng - có thể, nhưng không hoàn toàn.
Điều này là do MVC là một cách tiếp cận được phát triển vào cuối những năm 1970 cho ngôn ngữ lập trình Smalltalk-80. Vào thời điểm đó GUI và máy tính cá nhân khá phổ biến và trên toàn thế giới web thậm chí không được phát minh! Hầu hết các ngôn ngữ lập trình và IDE ngày nay được phát triển vào những năm 1990. Vào thời điểm đó, máy tính và giao diện người dùng hoàn toàn khác so với những năm 1970.
Bạn nên ghi nhớ điều đó khi nói về MVC.
Martin Fowler has written a very good article about MVC, MVP and today's GUIs.
Cảm ơn ví dụ. Đối với mục nhập email của quản trị viên (kiểm soát xem nó có thể bị xóa hay không), chúng tôi có thể không kiểm soát việc sử dụng bộ điều khiển của chúng tôi không? – hmthur
@mud gì nếu chúng ta chia mô hình của mình thành hai lớp khác, tức là lớp dịch vụ và kho lưu trữ ... lớp dịch vụ chịu trách nhiệm về logic nghiệp vụ và kho lưu trữ chịu trách nhiệm về lớp dữ liệu ...? – Dragon
@Mud có nghĩa là Business Logic được chứa trong bộ điều khiển? –