Sử dụng một lớp dịch vụ với MVC


12

Nếu một bộ điều khiển trở nên quá béo và việc khởi tạo mô hình bắt đầu thêm, một lớp dịch vụ có thể được sử dụng.

  • Nếu tôi chỉ bọc logic bên trong một lớp dịch vụ, tôi sẽ nhận được một loạt các Dịch vụ với một / hai phương thức. Cảm giác này giống như mùi mã. Bất kỳ thực hành tốt nhất về điều này?

  • Một mô hình dịch vụ có thể khởi tạo?

  • Nếu một dịch vụ khởi tạo mô hình, các dịch vụ không thể được kiểm tra đơn vị. Họ chỉ có thể được bao phủ bởi các bài kiểm tra tích hợp?

Câu trả lời:


23

Trong 'RẮN', 'Tôi' là viết tắt của Phân đoạn giao diện. Toàn bộ ý tưởng của nguyên tắc này là chia các giao diện lớn thành các giao diện nhỏ hơn, nhiều mô đun hơn. Trong dịch vụ MVC thông thường sẽ có một giao diện mà bộ điều khiển sẽ dựa vào. Bạn không muốn bộ điều khiển của mình biết về việc triển khai cụ thể dịch vụ đó. Do đó, một loạt các dịch vụ với một hoặc hai phương pháp là một điều tốt để có.

Các dịch vụ thường trả lại DTO trong các ứng dụng lớn hoặc mô hình miền trực tiếp trong các ứng dụng nhỏ hơn. DTO thường có nghĩa là nhiều công việc hơn, nhưng phân tách mối quan tâm tốt hơn. Dòng chảy điển hình là:

  • Điều khiển cuộc gọi dịch vụ
  • Dịch vụ trả về một đối tượng (có thể là DTO, mô hình miền hoặc một cái gì đó khác)
  • Bộ điều khiển ánh xạ mô hình DTO / domain sang mô hình xem

Việc lập bản đồ có thể được thực hiện thủ công, nhưng hầu hết các nhà phát triển thích sử dụng khung ánh xạ tự động như Automapper vì chúng tôi không thích viết mã hệ thống ống nước và chúng tôi có thể khá lười biếng :-)

http://en.wikipedia.org/wiki/Interface_segregation_principl

https://github.com/AutoMapper/AutoMapper

Một trong nhiều cuộc thảo luận về stackoverflow liên quan đến việc sử dụng DTO và mô hình miền: /programming/2680071/dto-or-domain-model-object-in-the-view-layer


1
Tôi sẽ cẩn thận khi sử dụng trình ánh xạ
Daniel Little

AutoMapper đi kèm với chức năng kiểm tra đơn vị tích hợp cho phép bạn xác minh tất cả các thói quen lập bản đồ của mình bằng một dòng. Tác giả của bài viết này đã không đề cập đến điều đó.
CodeART

Nhưng anh ấy biết về nó, và đã sử dụng nó. Các ý kiến ​​đi vào điều này một chút.
Daniel Little

2
Rất nhiều lớp chỉ có một hoặc hai phương thức thường có nghĩa là chúng không gắn kết. Một lớp dịch vụ, nếu nó tồn tại, phải mỏng với phần lớn logic có trong các mô hình. Có vẻ khá vô nghĩa khi trói một cái nhìn vào một vật câm không gì khác hơn là một túi tài sản. Mô hình trong MVC phải là mô hình miền phong phú, không phải là mô hình thiếu máu martinfowler.com/bliki/AnemiaDomainModel.html
Andy

3

Bộ điều khiển chỉ nên chứa các cuộc gọi đến mô hình (nơi xảy ra logic nghiệp vụ) và dựa trên các cuộc gọi đó gán dữ liệu cho chế độ xem (đối tượng thông tin hoặc thông báo lỗi) do đó bộ điều khiển sẽ khá nhỏ ngay cả đối với một trang rất phức tạp, nếu bộ điều khiển vẫn trở nên rất lớn bạn nên nghĩ rằng có lẽ trang đó nên được mở rộng thành nhiều trang hơn.

Tuy nhiên, mô hình có thể khá lớn ... giải pháp tôi tìm thấy là có một biến bên trong bộ điều khiển cho biết mô hình nào sẽ tải và đối với các tác vụ cụ thể tôi tải mô hình cụ thể.

Cố gắng tuân theo mô hình trình điều khiển khung nhìn mô hình sạch như thế này:

  • xem: hiển thị dữ liệu
  • Trình điều khiển: thu thập thông tin người dùng, yêu cầu mô hình cho dữ liệu được yêu cầu và gửi lại cho chế độ xem
  • mô hình: tương tác với cơ sở dữ liệu và thực hiện các hành động logic để chuẩn bị thông tin

2

Trong MVC Model, không chỉ là DTO hay tập hợp các Nhà quản lý / Dịch vụ, nó có nghĩa là đại diện cho các khái niệm mà ứng dụng của bạn đang lập mô hình. Bạn có thể nghĩ về điều này như toàn bộ miền hoặc logic kinh doanh bao gồm cả trạng thái và hành vi. Bây giờ cho rằng chúng ta biết rằng mục đích của bộ điều khiển trở nên rõ ràng hơn một chút. Công việc chỉ đơn giản là dịch các lệnh lên Model và kết quả quay lại các khung nhìn. Điều này thường được thực hiện dưới dạng ViewModels khác nhau nhưng thường bị nhầm lẫn với Model trong MVC.

Nếu bạn không có Mô hình được xác định rõ thì bạn có thể đã đi đến điểm mà phần lớn logic đó hiện đang nằm trong chính Bộ điều khiển. Tại thời điểm này để bắt đầu giảm kích thước bộ điều khiển của bạn, bạn có thể bắt đầu kéo logic này trở lại đối tượng quản lý hoặc dịch vụ. Các dịch vụ này thường trả về và hoạt động trên DTO / Entity như các đối tượng. Sau đó, bộ điều khiển trở thành lớp ánh xạ giữa các dịch vụ này và Mô hình xem. Để biết một vài mẹo hay về lập bản đồ, hãy xem bài viết này Bạn bè không cho phép bạn bè sử dụng AutoMapper .

Đối với câu hỏi của bạn, câu hỏi đầu tiên phụ thuộc rất nhiều vào các ứng dụng của bạn. Bạn sẽ cần thực hiện tái cấu trúc dọc theo con đường sẽ trở nên rõ ràng hơn một khi bạn đã loại bỏ logic khỏi bộ điều khiển của mình. Đối với thử nghiệm, không có vấn đề khởi tạo các mô hình bên trong các dịch vụ, tuy nhiên nếu bạn thấy việc kiểm tra khó khăn thì có lẽ đó chỉ là một dấu hiệu bạn cần chia dịch vụ thành các phần nhỏ hơn với mỗi trách nhiệm.


-1

Tôi thấy các dịch vụ thực sự hữu ích để thực hiện logic có thể cần thực hiện bởi nhiều hơn một bộ điều khiển hoặc nó không đủ cụ thể để trở thành một phần của bộ điều khiển, bên cạnh thực tế là nó ngăn bộ điều khiển của tôi trở nên quá lớn và khó đọc .. .

Cá nhân tôi không đồng ý với 'aaa' khi anh ấy nói rằng "mô hình (nơi logic kinh doanh xảy ra)" vì đó là toàn bộ lý do bạn có bộ điều khiển, theo tôi, các mô hình cần phải là trừu tượng hóa dữ liệu đơn giản để bộ điều khiển có thể thực hiện nhiệm vụ cần thiết; một lần nữa các dịch vụ không nên tham gia vào nhiệm vụ trừu tượng hóa dữ liệu ...

chỉ nói yo ....


1
Nếu mô hình của bạn chỉ là một dto bạn đã rơi vào mô hình tên miền thiếu máu martinfowler.com/bliki/AnemiaDomainModel.html
Andy
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.