14

Trong ứng dụng ASP.NET MVC của tôi, tôi đang sử dụng đơn vị công việc và các mẫu kho lưu trữ để truy cập dữ liệu.Nơi để chuyển đổi mô hình kinh doanh để xem mô hình?

Sử dụng đơn vị lớp công việc và kho lưu trữ được xác định bên trong nó Tôi đang tìm nạp tập hợp các thực thể liên quan trong bộ điều khiển của tôi. Với kiến ​​thức mới bắt đầu của tôi, tôi có thể nghĩ ra hai cách để tìm nạp mô hình kinh doanh và chuyển đổi nó để xem mô hình.

  • Repository trả về mô hình kinh doanh để điều khiển, mô hình này so với ánh xạ tới xem mô hình, hoặc
  • Repository tự chuyển đổi mô hình kinh doanh để xem mô hình và sau đó nó được trả lại cho bộ điều khiển.

Hiện tại tôi đang sử dụng phương pháp tiếp cận đầu tiên, nhưng mã bộ điều khiển của tôi bắt đầu trông xấu và dài đối với các kiểu xem có nhiều thuộc tính. Mặt khác, tôi nghĩ, vì kho lưu trữ của tôi được gọi là UserRepository (ví dụ), nên trả về mô hình kinh doanh trực tiếp, thay vì một số mô hình chỉ hữu ích cho một lần xem.

Bạn nghĩ thực tiễn nào tốt hơn cho các dự án lớn? Có cách nào khác không?

Cảm ơn.

+1

[Câu trả lời] [1] của tôi cho câu hỏi này sẽ giải thích cách thực hiện điều này tốt hơn. [1]: http://stackoverflow.com/questions/3747383/best-practices-to-partition-model-code-to-logical-parts-in-mvc-which-is-the- bes/3747474 # 3747474 –

Trả lời

20

Repositories nên trở lại mô hình miền, không xem các mô hình. Theo như các bản đồ giữa các mô hình và các mô hình xem là có liên quan, cá nhân tôi sử dụng AutoMapper vì vậy tôi có một lớp bản đồ riêng biệt nhưng lớp này được gọi là từ bộ điều khiển.

Dưới đây là làm thế nào một GET controller action điển hình có thể trông giống như:

public ActionResult Foo(int id) 
{ 
    // the controller queries the repository to retrieve a domain model 
    Bar domainModel = Repository.Get(id); 

    // The controller converts the domain model to a view model 
    // In this example I use AutoMapper, so the controller actually delegates 
    // this mapping to AutoMapper but if you don't have a separate mapping layer 
    // you could do the mapping here as well. 
    BarViewModel viewModel = Mapper.Map<Bar, BarViewModel>(domainModel); 

    // The controller passes a view model to the view 
    return View(viewModel); 
} 

trong đó tất nhiên có thể được rút ngắn với một bộ lọc hành động tùy chỉnh để tránh logic lập bản đồ lặp đi lặp lại:

[AutoMap(typeof(Bar), typeof(BarViewModel))] 
public ActionResult Foo(int id) 
{ 
    Bar domainModel = Repository.Get(id); 
    return View(domainModel); 
} 

Các AutoMap tùy chỉnh bộ lọc hành động đăng ký vào sự kiện OnActionExecuted, chặn mô hình được chuyển đến kết quả xem, gọi lớp ánh xạ (AutoMapper trong trường hợp của tôi) để chuyển đổi nó thành một mô hình khung nhìn và thay thế nó cho khung nhìn. Tất nhiên, chế độ xem được nhập mạnh mẽ vào mô hình xem.

+0

ty rất nhiều. Không biết về Automapper. Đó là những gì tôi cần trong vấn đề của tôi. –

+0

Phương pháp tiếp cận bộ lọc hành động tùy chỉnh có thể kiểm tra được không? Làm thế nào sẽ tự động lập bản đồ làm việc nếu điều này được gọi là từ bên trong một bài kiểm tra đơn vị? –

+1

@JoshuaBarker, toàn bộ điểm của một thử nghiệm đơn vị là bạn đang thử nghiệm một chức năng trong sự cô lập. Vậy chính xác bạn muốn kiểm tra sự cô lập ở đây là gì? Thuộc tính AutoMap? Tuyệt vời, hãy tiếp tục và viết một bài kiểm tra đơn vị cho điều đó. Hoặc hành động điều khiển của bạn mà là đi qua các mô hình miền để xem? Tuyệt vời, hãy tiếp tục và viết một bài kiểm tra đơn vị cho điều đó. Hoặc thực tế là hành động điều khiển của bạn được trang trí với thuộc tính AutoMap? Tuyệt vời, hãy tiếp tục và viết một bài kiểm tra đơn vị cho điều đó. Cho đến nay bạn đã viết 3 bài kiểm tra đơn vị với mọi thứ bạn cần để xác minh rằng hành động điều khiển của bạn sẽ hoạt động như mong đợi. –

2

Tôi nghĩ rằng kho lưu trữ của bạn phải trả về mô hình kinh doanh.

Sau đó, bạn có thể sử dụng công cụ như Automapper để tự động ánh xạ các thuộc tính tới chế độ xem của bạn và có thể loại bỏ mã ánh xạ thủ công. Cách tiếp cận này rất hữu ích nếu bạn không muốn phơi bày tất cả các thuộc tính của entitie của doanh nghiệp hoặc cấu trúc của comple cho khung nhìn.

Bạn cũng có thể tìm thấy điều này post hữu ích, nơi bạn có thể loại bỏ các cuộc gọi lập bản đồ thủ công (loại) và nó cũng cung cấp một ví dụ tốt về cách sử dụng chế độ xem v.v ... (theo ý kiến ​​của tôi) cảm hứng.

Trích từ bài viết (thuộc tính hiện mô hình dạng busioness chuyển đổi sang ViewModel):

[AutoMap(typeof(Product), typeof(ShowProduct))] 
public ActionResult Details(int id) 
{ 
    var product = _productRepository.GetById(id); 

    return View(product); 
} 
+0

ty rất nhiều. Câu trả lời của Darin là một chút chi tiết, vì vậy tôi chấp nhận câu trả lời của anh ấy. Hy vọng bạn không nhớ. –

+0

Cảm ơn, điều đó thật tuyệt. Cảm ơn bạn đã cung cấp thông tin - Tôi đồng ý rằng câu trả lời của Darin có nội dung giống nhau nhưng đang thể hiện tốt hơn (và do đó là câu trả lời hay hơn). Tôi vẫn khuyên bạn nên đọc liên kết, bởi vì có thể có thông tin thú vị khác trên Chế độ xem, v.v. –

+0

cảm ơn. Tôi đang đọc nó tại thời điểm này :) –

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