2011-06-22 33 views
7

Từ trong ra ngoài, đây là những MVC ứng dụng lớp của chúng tôi:ASP.NET MVC: Bạn lắp ráp mô hình xem ở đâu cho chế độ xem?

  1. MS SQL/Bàn/xem/lưu Procs
  2. Entity Framework 4.1 (ORM) với POCO hệ
  3. Repository
  4. Service (truy xuất) và Chức năng Điều khiển (Lưu)
  5. Định tuyến -> Bộ điều khiển -> Dao cạo Xem
  6. (khách hàng) JQuery Ajax với Knockout.js (MVVM)

Mọi thứ đều tốt đẹp cho đến khi tôi cần phải tạo ra một ViewModel duy nhất cho bước 5 để nuôi cả hai quan điểm Razor cũng như JSON/Knockout ViewModel:

  • header bao gồm tất cả Thả xuống tùy chọn danh sách và lựa chọn cho các lĩnh vực dưới đây
  • Items - một mảng của bất cứ điều gì chúng tôi gửi tới khách hàng đó trở thành ViewModel

Kể từ khi điều khiển sẽ không có quyền truy cập vào Repository trực tiếp, Điều này có nghĩa là tôi tạo ra một dịch vụ cho mỗi một mỗi lần xem cho phép chỉnh sửa nội dung? Tôi cần lấy POCO từ kho lưu trữ cộng với tất cả các tùy chọn cho từng loại trường khi cần thiết.

Có vẻ như không cần thiết để tạo các dịch vụ riêng biệt cho từng chế độ xem. Ví dụ, một viewModel để chỉnh sửa một địa chỉ và một viewModel riêng biệt để chỉnh sửa một thuộc tính bất động sản cũng có một địa chỉ. Chúng tôi có thể có hàng chục mẫu chỉnh sửa cùng địa chỉ POCO.

Để làm cho câu hỏi này dễ trả lời hơn, cho phép Bộ điều khiển truy cập trực tiếp vào kho lưu trữ một trừu tượng bị rò rỉ?

+0

bạn có thích loại trực tiếp không? tôi đã luôn luôn muốn tìm một lý do để sử dụng nó, và không bao giờ có. –

+0

@nathan Bạn nên kiểm tra video này http://channel9.msdn.com/events/mix/mix11/frm08. Nó sẽ giúp tìm lý do để sử dụng nó. Nó làm giảm mã xuống còn một nửa. –

Trả lời

1

Vâng, các bộ điều khiển của bạn sẽ có mã dịch POCO từ khung thực thể thành các đối tượng mô hình xem riêng biệt?

Nếu có, thì bạn nên chuyển mã đó sang một lớp riêng biệt và tuân theo nguyên tắc trách nhiệm duy nhất. Cho dù đó là lớp học trong "lớp dịch vụ" hay không là tùy thuộc vào bạn. Và cho dù bạn sử dụng AutoMapper hay không là tùy thuộc vào bạn. Nhưng những loại data mappers không nên là một phần của logic điều khiển; bộ điều khiển nên càng câm càng tốt.


OK, bây giờ, hãy bỏ qua vấn đề lập bản đồ dữ liệu và giả sử bạn luôn có thể sử dụng POCO trực tiếp làm mô hình xem.Sau đó, bạn sẽ vẫn muốn có một lớp dịch vụ, bởi vì nó sẽ dịch giữa

userService.GetByUserName("bob") 

trong điều khiển câm của bạn, và thực hiện điều đó một cách cụ thể bằng cách quay

userRepository.Users.Single(u => u.UserName == "bob") 


Đưa này lại với nhau, UserController của bạn kết thúc bằng các phụ kiện IUserServiceIUserDataMapper và mã siêu câm, như mong muốn:

public ActionResult ShowUserPage(string userName) 
{ 
    var user = userService.GetByUserName(userName); 
    var viewModel = userDataMapper.MakeViewModel(user); 

    return View(viewModel); 
} 

Bây giờ, bạn có thể kiểm tra bộ điều khiển với các cuống cho cả hai phụ thuộc hoặc khai báo IUserDataMapper trong khi bạn thử IUserService hoặc ngược lại. Bộ điều khiển của bạn có rất ít logic và has only one axis of change. Điều tương tự có thể được nói cho lớp người lập bản đồ dữ liệu người dùng và lớp dịch vụ người dùng.


Tôi đã đọc một bài báo sáng nay bạn có thể thấy phần nào chiếu sáng trên những vấn đề kiến ​​trúc này. Đó là, hơi bị hạ cấp, có tiêu đề "Software Development Fundamentals, Part 2: Layered Architecture". Có thể bạn sẽ không thể chuyển đổi từ mô hình ứng dụng cơ sở dữ liệu sang mô hình liên tục dốt nát mà bài viết mô tả và đề xuất. Nhưng nó có thể chỉ cho bạn đi đúng hướng.

+0

Đó là phần tôi đã mất tích, để tách Dịch vụ nhận thực thể từ cơ chế tạo ra một khung nhìn từ một tập hợp các thực thể. Tôi giả sử 'userDataMapper.MakeViewModel' sẽ có thể truy vấn cơ sở dữ liệu cho các tùy chọn có thể cho một danh sách thả xuống ví dụ để đặt trong tiêu đề của viewModel? –

+0

Vâng, nó phụ thuộc --- bạn có muốn đơn vị kiểm tra trình ánh xạ dữ liệu của bạn mà không có cơ sở dữ liệu trực tiếp không? Nếu vậy, thì trình ánh xạ dữ liệu có lẽ nên được tiêm với một số loại 'IOptionsConfiguration' hoặc' IOptionsRepository'. Sau đó, mã có liên quan trong trình ánh xạ dữ liệu trở thành chỉ 'options.GetUserTypes()' hoặc bất kỳ điều gì và các thử nghiệm của bạn có thể phân phối giao diện đó khi cần thiết. – Domenic

0

cá nhân tôi luôn đưa kho lưu trữ/kho lưu trữ vào bộ điều khiển. Tôi không chắc chắn lý do tại sao bạn muốn có một lớp dịch vụ giữa kho lưu trữ và bộ điều khiển. nếu bất cứ điều gì bạn sẽ sử dụng thông số kỹ thuật.

khi bạn đã hoàn tất, hãy xem automapper. một người lập bản đồ của nó, khi được định cấu hình đúng cách, có thể ánh xạ mô hình miền của bạn với mô hình chế độ xem và quay lại.

+0

Cẩn thận, đề cập đến thông số kỹ thuật của bạn khiến tôi nghĩ rằng bạn đang nói về kho lưu trữ _Domain Driven Design_, trong khi câu hỏi của OP dường như cho thấy anh ta đang làm việc chủ yếu với lớp DTO thiếu máu và khái niệm _Patterns của Enterprise Application Architecture_ về kho lưu trữ. – Domenic

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