Khi thực hiện Repository cho cơ sở dữ liệu trong dự án ASP.NET MVC, có đúng là đặt logic nghiệp vụ vào nó hay có thể tốt hơn để đặt logic trong lớp điều khiển? Hoặc sử dụng các lớp dịch vụ và trợ giúp bổ sung để thao tác dữ liệu?Nơi tốt nhất cho logic nghiệp vụ trong ASP.NET MVC khi sử dụng kho lưu trữ là gì?
Trả lời
Cuối cùng không có một nơi hoàn hảo cho logic kinh doanh của bạn ngoài lớp riêng của nó (như là một phần của lớp "Mô hình"). Thông thường, bạn có thể lấy đi với một triển khai khác nhau, nhưng có sự bù trừ giao dịch trong mọi trường hợp.
Việc giao dịch để tạo một lớp khác cho logic nghiệp vụ là bạn phải thực sự đóng gói mã của mình. Nếu bạn quá hung hăng, bạn cũng có thể nhận được một số sự trùng lặp giữa các thực thể và mô hình miền của bạn (nếu ngữ nghĩa quan hệ của DB của bạn đã xử lý logic buiness của bạn).
Xem
Quan điểm là phần giòn nhất của ứng dụng của bạn, vì nó là một phần rất có thể để thay đổi.
Cũng rất khó để có được logic kinh doanh đúng theo quan điểm của bạn, do phải hỗ trợ tất cả các chuyển đổi trạng thái xem khác nhau.
Nó được cực kỳ nổi tiếng trong những ngày mà bạn vừa không làm điều này :)
Repository
Vấn đề ở đây là một trong những bảo trì và độ tinh khiết của trừu tượng. Vi phạm điều này có thể gây nhầm lẫn cho mọi người và làm cho ứng dụng của bạn khó duy trì.
Từ the P of EAA article on the Repository pattern:
Một làm trung gian Repository giữa tên miền và lập bản đồ dữ liệu lớp, đóng vai trò như một trong bộ nhớ bộ sưu tập tượng miền
Một kho là một trừu tượng mà trình bày lưu trữ dữ liệu của bạn như bộ sưu tập mà giữ các đối tượng tên miền.
Không có miền nào phải nằm trong đó. Thay vào đó, nó sẽ tồn tại trong các đối tượng miền của bạn (theo định nghĩa, vì logic nghiệp vụ của bạn là tên miền của bạn).
Để làm khác (để làm cho kho lưu trữ của bạn làm nhiệm vụ kép và cũng xác thực logic miền) sẽ là vi phạm SRP (Single Responsibility Principle), và sẽ là một mùi mã.
Bạn có thể có đối tượng miền cấp cao hơn hoạt động với bộ sưu tập đối tượng miền để xác thực logic miền (chẳng hạn như phụ thuộc trong tập hợp đối tượng, giới hạn kích thước, v.v.). Họ sẽ vẫn sử dụng kho của bạn dưới bìa để lưu trữ/truy xuất cuối cùng các đối tượng miền, vì vậy chúng sẽ không làm nhiệm vụ kép (vì vậy sẽ không vi phạm SRP).
khiển
Bộ điều khiển cũng không phải là một nơi tốt để đặt logic kinh doanh. Công việc của bộ điều khiển là dàn xếp giữa bộ điều khiển và mô hình.
Mô hình là miền và miền là logic nghiệp vụ của bạn.
Entities
Bạn có thể xem xét việc đưa dữ liệu tên miền trong các thực thể. Tuy nhiên, bạn phải cẩn thận khi truy cập các thuộc tính điều hướng nếu các thực thể được đính kèm, vì bạn có thể kích hoạt các truy vấn hoặc ngoại lệ DB vô tình (tùy thuộc vào ngữ cảnh của bạn có được xử lý hay không). Tách chúng cũng là một vấn đề, vì nó phá hủy đồ thị đối tượng của bạn trừ khi bạn gắn lại các đối tượng với nhau một cách rõ ràng sau khi tách chúng ra khỏi ngữ cảnh.
Nếu bạn tạo các lớp mô hình miền riêng biệt, bạn có thể xem xét xử lý các thực thể là chỉ DTOs.
Edit: IValidatableObject
tôi phát hiện ra chỉ là bây giờ về một tính năng trong Entity Framework 4.1 mà bạn có thể muốn kiểm tra: giao diện IValidatableObject
.
Bạn có thể làm cho các thực thể của bạn một phần các lớp và trong lớp học một phần, triển khai thực hiện giao diện này. Khi bạn thực hiện, Khung thực thể sẽ gọi Validate
khi lưu và bạn có thể gọi Validate
bất cứ khi nào bạn làm như vậy.
Điều này có thể giúp bạn tránh tách mô hình kiên trì khỏi mô hình miền của mình trong các trường hợp bổ sung.
Xem bài viết này: http://msdn.microsoft.com/en-us/data/gg193959
Side lưu ý: Lần/Xem Models
Trong trường hợp bạn đang suy nghĩ về nó, tôi đề nghị bạn tránh được những cám dỗ để vượt qua các đối tượng quay trở lại xem. Nó sẽ phá vỡ trong nhiều trường hợp (ví dụ: tuần tự hóa Javascript để lưu trữ trạng thái xem) và gây ra các truy vấn DB không chủ ý trong các trường hợp khác. Vượt qua các loại đơn giản thay vào đó (chuỗi, ints, danh sách, hashsets, từ điển, v.v.) hoặc xây dựng các lớp mô hình xem để chuyển đến khung nhìn.
Logic nghiệp vụ phải có trong Mô hình miền của bạn.
Vui lòng xem câu trả lời này.
+1; Đọc này sau khi tôi đăng câu trả lời của tôi. Ngắn gọn hơn, mặc dù cùng một điểm :) –
cảm ơn cho liên kết hữu ích – Alexander
Thêm một Layer Dịch vụ để vượt qua mô hình để Repository, nơi các lớp dịch vụ tương ứng với bộ điều khiển có thể được thêm vào. Ví dụ, nếu bạn sử dụng một UserController và User Model, bạn có thể chuyển User Model đến lớp UserService.
Ở đây, lớp dịch vụ có thể hoạt động như một cầu nối giữa Kho lưu trữ và bộ điều khiển sao cho việc tách Bộ điều khiển và Kho lưu trữ được thiết lập tốt.
Theo tôi, nó phụ thuộc vào logic nghiệp vụ. Là logic dựa trên xác nhận của các quy tắc đầu vào và đầu vào, nếu như vậy nó có thể là tốt nhất để được trên mô hình. Tuy nhiên, nếu đó là quy tắc kinh doanh dựa trên quy trình làm việc thì có thể cần phải nằm trong bộ điều khiển, chẳng hạn như, người dùng chọn tùy chọn A sau đó được chuyển hướng đến một trang/biểu mẫu khác nếu tùy chọn B được chọn. Nếu các quy tắc kinh doanh phải đối phó với sự kiên trì dữ liệu thì nó có thể cần phải đi vào kho lưu trữ (Nó có vẻ lạ khi đặt nó ở đó cho tôi). Có rất nhiều cuộc thảo luận về vấn đề này, nhưng điều đó phụ thuộc vào quan điểm của bạn hoặc nhóm của bạn về cách sản phẩm cuối cùng duy trì và linh hoạt sẽ được dựa trên việc thực hiện.
Tôi đồng ý với các điều trên, bộ điều khiển không nên chịu trách nhiệm về logic nghiệp vụ chỉ đơn giản là trả lại các chế độ xem phù hợp. Tôi sử dụng một lớp dịch vụ để cung cấp logic nghiệp vụ và xem tạo mô hình để một bộ điều khiển chỉ đơn giản chuyển mô hình được trả về từ một dịch vụ tới một khung nhìn.
Tôi cũng đảm bảo các mô hình chế độ xem của mình là các DTO đơn giản và dịch vụ chỉ đơn giản là biết cách điền các thuộc tính một cách thích hợp.
- 1. Nơi đặt logic nghiệp vụ trong Symfony2?
- 2. Nơi đặt logic nghiệp vụ trong DDD
- 3. Logic nghiệp vụ trong MVC
- 4. MVC/MVP/MVVM - Cách sắp xếp logic nghiệp vụ
- 5. Kho lưu trữ mã. Whats tốt nhất?
- 6. Kho lưu trữ chung của ASP.NET MVC
- 7. Sử dụng các giao dịch với quy trình nghiệp vụ và mẫu Kho lưu trữ
- 8. Đối tượng Kho lưu trữ, Dịch vụ hoặc Miền - nơi logic thuộc về?
- 9. Cách tốt nhất để kiểm tra Các kho lưu trữ sử dụng DbContext
- 10. Đâu là nơi tốt nhất để chỉ định kho lưu trữ maven, pom.xml hoặc settings.xml?
- 11. asp.net mvc - nơi lưu trữ userid - số nguyên?
- 12. ASP.NET MVC không tốt cho điều gì?
- 13. Lập bản đồ thực thể cho mô hình và thực hiện logic nghiệp vụ trong ASP.NET MVC
- 14. Nơi tốt nhất để báo cáo lỗi trong ASP.NET MVC là gì?
- 15. Quản lý kho lưu trữ tốt nhất cho Maven
- 16. Đâu là nơi tốt nhất để lưu trữ ảnh toàn cầu trong ứng dụng Rails?
- 17. Thực tiễn tốt nhất để sử dụng lưu trữ cục bộ luồng trong .NET là gì?
- 18. Cách tốt nhất để triển khai Mẫu Kho lưu trữ là gì?
- 19. thực hành tốt nhất: cách lưu trữ mã phía máy chủ trong kho lưu trữ maven
- 20. Bộ nhớ đệm tốt nhất cho Nhibernate khi sử dụng ứng dụng web MVC là gì?
- 21. Cách cấu hình tốt nhất kho lưu trữ trung tâm/nhiều kho trung tâm cho Mercurial?
- 22. ASP.NET MVC: Sự khác biệt về khái niệm giữa Dịch vụ và Kho lưu trữ
- 23. Công cụ lưu trữ MySQL tốt nhất để sử dụng cho việc lưu trữ phiên PHP
- 24. Liệu logic nghiệp vụ có chủ quan?
- 25. ASP.NET MVC: Có bao nhiêu kho lưu trữ?
- 26. Thực tiễn tốt là sử dụng kho lưu trữ chung hay mỗi thực thể có kho lưu trữ riêng của mình?
- 27. CakePHP: Nơi đặt logic 'Dịch vụ'
- 28. Lựa chọn tốt nhất để lưu trữ kho lưu trữ Maven và tích hợp liên tục?
- 29. Cách chia sẻ logic nghiệp vụ giữa nhiều ứng dụng
- 30. Cách tốt nhất để dọn sạch kho lưu trữ Subversion là gì?
cảm ơn cho câu trả lời tuyệt vời! một câu hỏi: trong trường hợp khi chúng ta đặt logic kinh doanh trong mô hình lớp chúng ta nên suy nghĩ về mô hình như nó là ViewModel (một cái gì đó giống như trong WPF)? – Alexander
@ Alexander: Có một số điểm tương đồng, vâng. Nhưng tôi không chắc chắn những điều bạn nghĩ về khi bạn nhìn thấy mô hình xem hạn. Mối quan hệ một-một không phổ biến giữa các khung nhìn và các đối tượng mô hình miền như giữa các khung nhìn và xem các đối tượng mô hình. Và nó phổ biến hơn nhiều để thiết kế mô hình miền của bạn cho phù hợp với nhu cầu của nhiều ứng dụng (ví dụ: sử dụng trong cả web GUI và dịch vụ web) so với mô hình khung nhìn (thường chỉ là một ứng dụng WPF duy nhất, mặc dù có thể là nhiều phần của ứng dụng đó) . –
tôi nghĩ rằng tôi đã nhận được điểm, nhờ giải thích – Alexander