ASP.NET MVC - Có nên logic nghiệp vụ trong bộ điều khiển không?


97

Derik Whitaker đã đăng một bài báo vài ngày trước, nhấn vào một điểm mà tôi đã tò mò về một thời gian: logic nghiệp vụ có nên tồn tại trong bộ điều khiển không?

Cho đến nay, tất cả các bản trình diễn ASP.NET MVC mà tôi đã thấy đều đặt quyền truy cập kho lưu trữ và logic nghiệp vụ trong bộ điều khiển. Một số thậm chí còn ném xác nhận vào đó. Điều này dẫn đến các bộ điều khiển khá lớn, cồng kềnh. Đây có thực sự là cách sử dụng MVC framework không? Có vẻ như điều này sẽ kết thúc với rất nhiều mã trùng lặp và logic trải dài trên các bộ điều khiển khác nhau.


Liên kết đến bài viết đã chết - web.archive.org/web/20150906064521/http://devlicio.us/blogs/… là bản sao từ archive.org cho bất kỳ ai quan tâm.
Stuart Moore

Câu trả lời:


75

Logic kinh doanh thực sự nên có trong mô hình. Bạn nên hướng đến những người mẫu béo, người gầy.

Ví dụ, thay vì có:

public interface IOrderService{
    int CalculateTotal(Order order);
}

Tôi thà có:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

Điều này giả định rằng thuế được tính toán bởi một dịch vụ bên ngoài và yêu cầu mô hình của bạn biết về các giao diện với các dịch vụ bên ngoài của bạn.

Điều này sẽ làm cho bộ điều khiển của bạn trông giống như sau:

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

Hoặc điều tương tự.


1
Vì vậy, bạn sẽ đưa Dịch vụ vào bộ điều khiển của mình thay vì kho lưu trữ? Nguyên tắc Đơn vị Công việc phát huy tác dụng như thế nào trong trường hợp đó?
Kevin Pang

Tôi đã viết thêm một số thứ, tôi hy vọng điều này có ý nghĩa hơn. Bạn cũng có thể muốn đọc: weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model Mặc dù là về Rails, nó vẫn được áp dụng rất nhiều.
jonnii

Cá nhân tôi gọi một kho lưu trữ là một dịch vụ.
Brad Wilson

Chúng chắc chắn là một loại dịch vụ, nhưng dành riêng cho việc truy cập dữ liệu. Đó chỉ là một quy ước mà tôi sử dụng, không phải thứ mà tôi ủng hộ cụ thể.
jonnii

1
Điều này sẽ làm cho mô hình của bạn kết hợp chặt chẽ với ITaxService. Nếu bạn muốn sử dụng lại mô hình trong một dự án khác hoặc dll khác, bạn phải có triển khai hoặc tham chiếu ITaxService, nếu không mô hình của bạn sẽ bị hỏng, dẫn đến vi phạm các nguyên tắc SOLID. ITaxService nên có tham chiếu mô hình của bạn. Với cách này, bạn có thể sử dụng lại mô hình của mình trong dự án khác mà không cần tham chiếu ITaxService.
Mehmet Ali Sert

65

Tôi thích sơ đồ được trình bày bởi Microsoft Patterns & Practice . Và tôi tin vào câu ngạn ngữ 'Một bức tranh đáng giá ngàn lời nói'.

Sơ đồ hiển thị kiến ​​trúc của MVC và các lớp thiết bị kinh doanh


6
Điều đó thực sự hữu ích! Bạn có thể cho tôi biết bạn đã tìm thấy sơ đồ này ở đâu trên trang web đó không?
Rob Church

2
Đây là từ 'Triển khai phía máy chủ' của Microsoft msdn.microsoft.com/en-us/library/hh404093.aspx
Justin

OK nhưng trong ứng dụng MVC - logic nghiệp vụ sẽ đi đến đâu? Có vẻ như chúng ta cần một lớp dịch vụ additoinal hay gì đó ?!
niico

14

Đây là một câu hỏi hấp dẫn.

Tôi nghĩ rằng thật thú vị khi một số lượng lớn các ứng dụng MVC mẫu thực sự không tuân theo mô hình MVC theo nghĩa thực sự đặt hoàn toàn "logic kinh doanh" trong mô hình. Martin Fowler đã chỉ ra rằng MVC không phải là một khuôn mẫu theo nghĩa của Gang Of Four. Đúng hơn, đó là mô hình mà lập trình viên phải thêm các mẫu vào nếu họ đang tạo ra thứ gì đó ngoài ứng dụng đồ chơi.

Vì vậy, câu trả lời ngắn gọn là "logic nghiệp vụ" thực sự không nên tồn tại trong bộ điều khiển, vì bộ điều khiển có thêm chức năng xử lý chế độ xem và tương tác của người dùng và chúng tôi muốn tạo các đối tượng chỉ với một mục đích.

Một câu trả lời dài hơn là bạn cần phải suy nghĩ về thiết kế lớp mô hình của mình trước khi chuyển logic từ bộ điều khiển sang mô hình. Có lẽ bạn có thể xử lý tất cả logic ứng dụng bằng REST, trong trường hợp đó, thiết kế của mô hình phải khá rõ ràng. Nếu không, bạn nên biết bạn sẽ sử dụng cách tiếp cận nào để giữ cho mô hình của bạn không bị cồng kềnh.


14

Bạn có thể xem hướng dẫn tuyệt vời này của Stephen Walther cho thấy Xác thực bằng Lớp dịch vụ .

Tìm hiểu cách di chuyển logic xác thực của bạn ra khỏi các hành động của bộ điều khiển và vào một lớp dịch vụ riêng biệt. Trong hướng dẫn này, Stephen Walther giải thích cách bạn có thể duy trì sự tách biệt rõ ràng các mối quan tâm bằng cách cô lập lớp dịch vụ khỏi lớp điều khiển của bạn.


2
Đây là câu trả lời chính xác nhất. Cá nhân tôi ủng hộ thêm việc không để lộ các dịch vụ cho bộ điều khiển, thay vào đó chọn sử dụng khái niệm ViewModel như được tìm thấy trong mẫu MVVM. Hãy tưởng tượng một tình huống mà bạn muốn viết một ứng dụng kinh doanh với giao diện máy tính để bàn (ví dụ như các biểu mẫu windows hoặc WPF) và cả giao diện web. Giải quyết vấn đề đó dẫn bạn đến mô hình "bộ điều khiển gầy" như được khuyến khích ở đây. Điểm mấu chốt: không bao giờ đặt logic nghiệp vụ vào một mô hình hoặc một bộ điều khiển và đừng đặt bất cứ thứ gì vào một bộ điều khiển mà bạn cũng không có.
Sam

9

Logic nghiệp vụ không được chứa trong bộ điều khiển. Bộ điều khiển phải càng mỏng càng tốt, lý tưởng nhất là theo mẫu:

  1. Tìm thực thể miền
  2. Hành động trên thực thể miền
  3. Chuẩn bị dữ liệu để xem / trả kết quả

Ngoài ra, bộ điều khiển có thể chứa một số logic ứng dụng.

Vậy tôi phải đặt logic kinh doanh của mình ở đâu? Trong Mô hình.

Model là gì? Bây giờ đó là một câu hỏi hay. Vui lòng xem bài viết Mô hình và Thực tiễn của Microsoft (kudos cho AlejandroR để tìm kiếm xuất sắc). Ở đây có ba loại mô hình:

  • View Model : Đây đơn giản là một túi dữ liệu, với logic tối thiểu, nếu có, để truyền dữ liệu từ và đến các khung nhìn, chứa xác thực trường cơ bản.
  • Mô hình miền : Mô hình béo với logic nghiệp vụ, hoạt động trên một hoặc nhiều thực thể dữ liệu (nghĩa là thực thể A ở trạng thái nhất định hơn là hành động trên thực thể B)
  • Mô hình dữ liệu : Mô hình nhận biết lưu trữ, logic chứa trong một thực thể đơn lẻ chỉ liên quan đến thực thể đó (ví dụ nếu trường a thì trường b)

Tất nhiên, MVC là một mô hình có nhiều loại khác nhau. Những gì tôi mô tả ở đây là MVC chỉ chiếm lớp trên cùng, hãy quay video bài viết này trên Wikipedia

Ngày nay, MVC và người trình bày theo mô hình tương tự (MVP) là các mẫu thiết kế Tách mối quan tâm áp dụng riêng cho lớp trình bày của một hệ thống lớn hơn. Trong các tình huống đơn giản, MVC có thể đại diện cho thiết kế chính của một hệ thống, tiếp cận trực tiếp với cơ sở dữ liệu; tuy nhiên, trong hầu hết các tình huống, Bộ điều khiển và Mô hình trong MVC có sự phụ thuộc lỏng lẻo vào Lớp / tầng Dịch vụ hoặc Dữ liệu. Đây là tất cả về kiến ​​trúc Máy khách-Máy chủ


-1

Nếu bạn sử dụng Dependency Injectors, logic nghiệp vụ của bạn sẽ chuyển đến chúng và do đó bạn sẽ nhận được các bộ điều khiển gọn gàng và sạch sẽ.

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.