2011-10-30 25 views
34

Tôi tò mò về tất cả các cách khác nhau mà mọi người đang xây dựng Mô hình Chế độ xem của họ và tại sao họ chọn phương thức đó.Làm cách nào để bạn điền/xác thực Mô hình Chế độ xem của mình?

Tôi có thể nghĩ ra một số cách ở đây:

-1. Kho chứa được tiêm - bộ điều khiển tải mô hình và ánh xạ tới ViewModel. Ở đây, hàm tạo ViewModel có thể lấy các bộ sưu tập khác nhau để thiết lập cho nhau. trong danh sách lựa chọn như:

 

public CustomerController(ISomeRepository repository) 
{ 
    _repository = repository; 
} 

public ActionResult Create() 
{ 
    CustomerCreateViewModel model = new CustomerCreateViewModel(_repository.GetShipTypes, 
                   _repository.GetStates); 
.. 
.. 
} 
 

-2. ViewModelBuilder - Hoặc được tiêm hoặc khởi tạo trong bộ điều khiển với một thể hiện của kho lưu trữ được tiêm. Gọi qua một cái gì đó giống như

>var orderViewModel = orderViewModelBuilder.WithStates().Build(orderId);

hay,

var orderViewModel = orderViewModelBuilder.WithStates().Build(orderId);

-3. Trực tiếp trong bộ điều khiển (không cần mã - lộn xộn)

-4. Một số dịch vụ khác (tiêm hay không) trả về mô hình miền mà bộ điều khiển sau đó bản đồ hoặc một ViewModel (bất cứ ai làm điều này để trả về một mô hình điểm cho rằng không được đặt tên đặc biệt/ghi nhận như là một lớp người xây dựng ViewModel?)


public JobCreateViewModel BuildJobCreateViewModel(int parentId) 
{ 
    JobCreateViewModel model = new JobCreateViewModel(); 
    model.JobStatus = _unitOfWork.JobRepository.GetJobStatuses(); 
    model.States=_unitOfWork.StateRepository.GetAll(); 
    return model; 
} 

Bây giờ trên chuyến trở về - liên quan đến việc xác nhận các mô hình xem của bạn - bạn có kế thừa từ lớp ViewModel cơ bản để xác thực tiêu chuẩn hay sao chép các xác thực của bạn (ví dụ: thuộc tính chú thích dữ liệu) giữa tất cả các Mô hình Chế độ xem của bạn hay đơn giản là dựa vào xác thực phía máy chủ tất cả có thể được xác thực againt đối tượng miền của bạn?

Mọi người khác? Có gì tốt hơn không? Tại sao?

EDIT Dựa trên liên kết bên dưới, tôi đã tìm thấy một bài viết hay từ Jimmy Bogard về kiến ​​trúc của ViewModels. Mặc dù nó không trực tiếp giải quyết câu hỏi trên, nhưng đây là một tham chiếu tuyệt vời cho bất kỳ ai đến đây để biết thông tin ViewModel. http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

+0

có một lưu ý ở đây - chỉ cần tò mò tại sao - bất cứ điều gì tôi có thể làm rõ? –

+4

Trên điện thoại của tôi và tôi vô tình nhấp vào nó khi cố gắng gắn dấu sao - xin lỗi. Bây giờ đã quá muộn để hoàn tác. – Jason

+0

ah không phải lo lắng sau đó:) –

Trả lời

14

Tôi đưa một dịch vụ vào bộ điều khiển, không phải là một kho lưu trữ, và sau đó sử dụng AutoMapper để chuyển đổi nó thành một kiểu xem. Lợi ích của lớp dịch vụ trong trường hợp này là nó có thể tổng hợp nhiều phép toán đơn giản từ một hoặc nhiều kho lưu trữ vào một hoạt động duy nhất để lộ một mô hình miền. Ví dụ:

private readonly ICustomerService _service; 
public CustomerController(ICustomerService service) 
{ 
    _service = service; 
} 

[AutoMap(typeof(Customer), typeof(CustomerViewModel))] 
public ActionResult Create(int id) 
{ 
    Customer customer = _service.GetCustomer(id); 
    return View(customer); 
} 

trong ví dụ này AutoMap là một bộ lọc hành động tùy chỉnh mà tôi có thể viết mà thực hiện sau khi hành động điều khiển, kiểm tra các đối tượng quay trở lại và sử dụng ánh xạ AutoMapper định nghĩa để ánh xạ nó vào loại đích được chỉ định. Vì vậy, khung nhìn nhận được CustomerViewModel tương ứng làm kiểu mô hình. Có thể tương đương với:

public ActionResult Create(int id) 
{ 
    Customer customer = _service.GetCustomer(id); 
    CustomerViewModel vm = Mapper.Map<Customer, CustomerViewModel>(customer); 
    return View(vm); 
} 

nó chỉ là quá nhiều mã ống dẫn nước và lặp lại có thể tập trung.

Tôi cũng khuyên bạn nên xem putting your controllers on a diet video từ Jimmy Bogard.

+0

Cảm ơn Darin. Tôi đã xem ai đó giới thiệu một thuộc tính AutoMap tương tự - tôi thấy Jimmy có sẵn. Bạn làm gì để xác thực khách hàng của các mô hình khung nhìn này (hay không bạn?) Và chia sẻ logic xác thực giữa chúng? Sau đó, bạn có đang đưa kho lưu trữ của mình vào lớp dịch vụ không? –

+0

@AdamTuliper, tôi sử dụng FluentValidation.NET để xác thực phía máy chủ và cho các kịch bản xác thực phía máy khách đơn giản (bắt buộc, ngày lớn hơn, ...). Đối với các kịch bản xác thực phía máy khách phức tạp hơn (thuộc tính phụ thuộc, ...), tôi quyết định có cần xử lý nó trên máy khách hay không và nếu có yêu cầu để thực hiện xác thực phía máy khách cho các kịch bản đó, tôi viết các trình bổ sung jquery tùy chỉnh hợp lệ. Theo như kho lưu trữ vào lớp dịch vụ có liên quan, có lớp dịch vụ sử dụng ctor injection để có tất cả các kho lưu trữ cho phép thực hiện các hoạt động CRUD đơn giản trên các mô hình miền. –

+0

Cảm ơn Darin, một câu trả lời hay khác:) –

0

Phương pháp của chúng tôi là đưa kho lưu trữ vào bộ điều khiển và ánh xạ nó vào ViewModel bằng Automapper http://automapper.org/. ViewModels của chúng tôi chứa các thuộc tính chú thích dữ liệu để cho phép xác thực xảy ra trên máy khách.

Chúng tôi gọi phương thức trên kho lưu trữ trả về đối tượng Miền (Entity Framework). Các đối tượng miền được ánh xạ tới ViewModel. Chúng tôi có xu hướng sử dụng cùng một ViewModel để chỉnh sửa và bổ sung nên các chú thích dữ liệu là cần thiết một lần. Ở dạng đơn giản nhất, nó trông giống như mã sau:

public ActionResult List(int custId, int projId) 
    { 
     var users = _userRepository.GetByCustomerId(custId); 
     var userList = Mapper.Map<IEnumerable<CMUser>, IEnumerable<UserListViewModel>>(users); 
     return View(userList); 
    } 
+0

nhưng một kho lưu trữ không được ánh xạ tới một mô hình khung nhìn. Một số phương thức phải được gọi trong kho để trả về một đối tượng miền hoặc một mô hình khung nhìn. Ngoài ra, điều này không bao gồm nếu bạn sử dụng chú thích riêng cho từng mô hình hoặc vị trí được chia sẻ, v.v. –

+0

Ngoài ra, nếu sử dụng cùng ViewModel cho chỉnh sửa/bổ sung thì bạn đang làm gì với trường ID số nguyên theo mặc định với chú thích dữ liệu ? Nếu thiếu từ biểu mẫu, nó sẽ thất bại validaton. Ints được yêu cầu theo mặc định, do đó bạn sẽ phải khởi tạo 0 cho kịch bản "tạo", không? –

1

Tôi vừa hoàn thành một dự án mà chúng tôi đã thực hiện một biến thể trên # 4. Chúng tôi đã có một lớp dịch vụ được tiêm vào bộ điều khiển. Lớp dịch vụ chứa các phụ thuộc vào kho lưu trữ và một lớp trình xây dựng mô hình (chúng tôi gọi nó là nhà máy mô hình).

Bộ điều khiển được gọi vào lớp dịch vụ, xử lý logic xác thực nghiệp vụ và sau đó tìm nạp các kiểu xem từ nhà máy thích hợp. Các mô hình tự dựa vào chú thích dữ liệu để xác thực đầu vào.

Nó hoạt động rất tốt cho nhóm của chúng tôi. Có đủ sự quan tâm để cho phép các nhà phát triển thực hiện công việc của mình mà không ảnh hưởng lẫn nhau, nhưng nó có thể quản lý đủ để hiểu chuyện gì đang diễn ra.

Đây là lần đầu tiên chúng tôi thử nó và chúng tôi sẽ gắn bó với nó. Tôi quan tâm để xem cách người khác phản hồi.

+0

cảm ơn. Vì vậy, lớp dịch vụ của bạn lần lượt được tiêm vào kho lưu trữ? Phương pháp của bạn được thiết lập như thế nào cho ví dụ. trong lớp dịch vụ? Làm cách nào bạn xử lý xác thực phía khách hàng trên nhiều mô hình xem nhưng tương tự? (ví dụ: chỉnh sửa và tạo) –

+0

nó rất giống với ví dụ của Darin bên dưới, chúng tôi đã có một yêu cầu khốc liệt rằng chúng tôi không thể sử dụng phần mềm nguồn mở, vì vậy chúng tôi không thể sử dụng Automapper. Lần tới, chúng tôi sẽ thay thế nhà máy sản xuất mô hình chế độ xem bằng automapper. Chúng tôi đã sử dụng mẫu Hiển thị và Trình chỉnh sửa để phân phối các chế độ xem khác nhau của cùng một mô hình, chú thích dữ liệu đã cung cấp cho chúng tôi tất cả xác thực mà chúng tôi cần. – Jason

+0

Và lớp trình xây dựng mô hình nhận đối tượng kho lưu trữ từ một tham số hàm tạo (dịch vụ xử lý đối tượng kho lưu trữ) hoặc trình tạo mô hình trực tiếp sử dụng kho lưu trữ chính nó? Bạn có thể vui lòng cung cấp một số ví dụ rất đơn giản không? – Muflix

0

Tôi sử dụng một lớp dịch vụ ẩn mô hình miền khỏi bộ điều khiển trả về Chế độ xem biểu mẫu từ các phương thức dịch vụ. Điều này cho phép tôi thực hiện thay đổi đối với mô hình miền mà không ảnh hưởng đến ứng dụng khách.

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