2011-10-15 54 views

Trả lời

14

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 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.

+0

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

+0

@ 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 đó) . –

+0

tôi nghĩ rằng tôi đã nhận được điểm, nhờ giải thích – Alexander

6

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.

0

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.

1

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.

Các vấn đề liên quan