9

Trong ứng dụng ASP.NET MVC của tôi, tôi có một trang chỉnh sửa khá phức tạp kết hợp một số mô hình thành một chế độ xem.ASP.NET MVC - Tôi có nên sử dụng Pattern Repository để viết ViewModels vào cơ sở dữ liệu hay chuyển đổi chúng thành Models trước không?

Tôi đang sử dụng mẫu ViewModel để kết hợp tất cả thông tin này và hiển thị một đối tượng cố kết với Chế độ xem.

Như một ví dụ, cấu trúc ViewModel của tôi là một cái gì đó như thế này:

CompanyId 
CompanyName 
List<Employee> Employees 
List<ContactMethod> ContactMethods 

Đối tượng người lao động có một số đặc tính cơ bản, và một phương pháp tiếp xúc ưa thích.

Trên trang chỉnh sửa, người dùng được cung cấp tất cả nhân viên của công ty và họ có khả năng thêm và xóa (sử dụng javascript), cũng như chỉnh sửa chi tiết nhân viên. Danh sách ContactMethods được sử dụng để điền vào danh sách thả xuống cho mỗi nhân viên.

Tôi đã dịch thành công Mô hình của mình (đọc từ cơ sở dữ liệu) sang ViewModel này và ngược lại, vì vậy sau khi chỉnh sửa, tôi đã để lại ViewModel đại diện cho trạng thái hiện tại của nhân viên của công ty đó.

Tôi đang sử dụng mẫu Kho lưu trữ để liên lạc với cơ sở dữ liệu, vì vậy câu hỏi của tôi là, tôi nên gọi trực tiếp vào CompanyRepository, chuyển ViewModel hoặc tôi nên chuyển ViewModel trở lại thành đối tượng Mô hình trước khi sử dụng Kho lưu trữ để viết chúng vào cơ sở dữ liệu?

Tóm lại, Repository có biết về các đối tượng ViewModel của tôi không?

Trả lời

13

Tôi sẽ chuyển đổi ViewModel trở lại thành đối tượng Mô hình trước. Tôi thích giữ sự phụ thuộc giữa lớp Web và lớp Repository của tôi càng lỏng càng tốt.

Tôi không nghĩ rằng Kho lưu trữ của bạn nên biết về ViewModel của bạn, vì đó là khái niệm cấp web.

+0

Nếu đó là trường hợp (và điều này là tốt), tôi cần phải tạo ra các mô hình nhân viên, xóa tất cả nhân viên hiện có từ công ty đó, sau đó thêm mô hình nhân viên mới ... hoặc ... Lấy tất cả các mô hình nhân viên từ cơ sở dữ liệu và so khớp chúng trước khi thêm, xóa và chỉnh sửa nếu thích hợp. Điều đó có đúng không? – Damovisa

+0

@Damovisa: bạn có thể làm điều đó. Thay vào đó, tôi sẽ duy trì thông tin đó trong quá trình chỉnh sửa. Trong ViewModel của bạn duy trì ba danh sách: CreatedEmployees, EditedEmployees, DeletedEmployees. – manu08

+0

@ manu80 - Tôi thấy cách đó có thể hoạt động, nhưng nó có thể hơi phức tạp một chút. Giao diện người dùng sẽ phải thay đổi khá nhiều để tính toán cho ba bộ sưu tập này - ngay cả khi nó chỉ thay đổi javascript. – Damovisa

4

ViewModel là mô hình cho chế độ xem (Giao diện người dùng), vì vậy kho lưu trữ không nên biết về mô hình chế độ xem. Tách chúng sẽ giữ kho được ghép lỏng lẻo với giao diện người dùng.

Sử dụng một lớp khác như lớp dịch vụ, để đóng gói kho lưu trữ từ giao diện người dùng. Lớp này cũng thực hiện cuộc trò chuyện ViewModel - Mô hình và thực hiện cuộc gọi qua ký tự.

public class ServiceLayer 
{ 
    public void SaveModel(ViewModel viewmodel) 
    { 
     var model = viewModel.ToModel(); 
     repository.Save(model) 
    } 
} 
+0

Tại sao làm cho ServiceLayer phụ thuộc vào ViewModel? Thay vào đó hãy gọi viewModel.ToModel trong lớp xem và sau đó chuyển mô hình xuống dịch vụ. – manu08

+0

@Hery - Có, nó có vẻ tốt, nhưng có nhiều thứ hơn là chỉ chuyển một mô hình lên tới Kho lưu trữ. Mô hình nhân viên có thể mới, thay đổi hoặc bị xóa. – Damovisa

+0

@manu: đó chỉ là một cách khác để triển khai, phụ thuộc vào cách bạn muốn đóng gói kho lưu trữ của mình từ chế độ xem. Nhưng tôi có thể liệt kê một số lợi ích như: - Thực hiện một số xác thực doanh nghiệp không được bao gồm trong chuyển đổi ToModel. - Giữ mô hình kho lưu trữ đơn giản và chung chung, trong khi lớp dịch vụ thực hiện các tác vụ cụ thể hơn được gắn với viewmodel chỉ 2 xu của tôi :) – heisthedon

1

tôi sẽ đồng ý với câu trả lời trước của chuyển đổi ViewModels trở thành mô hình "đồng bằng", nhưng sẽ thêm rằng nhiệm vụ này có lẽ nên được thực hiện bởi một lớp dịch vụ riêng biệt. Lớp này sẽ chịu trách nhiệm cho việc tháo rời ViewModels của bạn và hành động một cách thích hợp.

Đây thực chất là định nghĩa của một dịch vụ: một công việc có nghĩa là thực hiện một đơn vị công việc hợp lý đòi hỏi nhiều mô hình và/hoặc logic phức tạp.

+0

Tôi nghĩ rằng điều chỉnh này phải tách biệt với Bộ điều khiển, nhưng tôi không nghĩ phù hợp với một lớp hoàn toàn riêng biệt. Nó chỉ là một khái niệm lớp Xem, và nên rơi vào các lớp thấp hơn. Bạn chỉ có thể tạo Adapters hoặc một số loại helper class trong cùng một lớp với Controllers/Views. Tôi sẽ lưu lớp dịch vụ đó (giữa kho lưu trữ và lớp xem) để xác thực mô hình. – manu08

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